#!/usr/bin/env python
#-*- coding:utf-8 -*-
#@time : 2020/1/23 1:50
#@author : liuyan
#@file : test5_tcp_server_5協程gevent版本.py
#@software: pycharm
import
gevent
from gevent import
monkey; monkey.patch_all()
#使用此方法,會將**中檢查一遍,如有time.sleep()等延時方法,會自動轉換為gevent.sleep()
#在執行時動態替換,通常是在startup的時候.
#把標準庫中的thread/socket等給替換掉.這樣我們在後面使用socket的時候能夠跟尋常一樣使用,無需改動
#呼叫此函式就不需要將time.sleep()手動換為gevent.sleep(),socket也不需要手動替換
#gevent的優勢不僅僅是在**中呼叫方便,厲害的是它擁有的monkey機制。
#假設你不願意修改原來已經寫好的python**,但是又想充分利用gevent機制,那麼你就可以用monkey來做到這一點。
#你所要做的就是在檔案開頭打乙個patch,那麼它就會自動替換你原來的thread、socket、time、multiprocessing等**,全部變成gevent框架。
#這一切都是由gevent自動完成的。注意這個patch是在所有module都import了之後再打,否則沒有效果。##
#import
time
import socket #
使用gevent,原**不需要修改,socket和time.sleep不需要手動替換,呼叫monkey.patch_all()自動替換
defeach_do(clientfd):
while
true:
recvdata = clientfd.recv(1024) #
gevent遇到這種耗時操作,自動切換動其它協程
if len(recvdata) >0:
clientfd.send(recvdata)
print("
recv=%s, echo back
" % recvdata.decode("
utf8"))
else
:
print("
closed")
clientfd.close()
break
deftcp_server():
fd_listen =socket.socket(socket.af_inet, socket.sock_stream)
fd_listen.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1) #
位址重用
fd_listen.bind(('', 7777))
fd_listen.listen(3) #
可以不指定最大允許量, 指定表示:"正在排隊等待accept的半連線個數"
while
true:
clientfd, clientinfo = fd_listen.accept() #
gevent遇到這種耗時操作,自動切換動其它協程
print("
accept from %s
" %(clientinfo,))
gevent.spawn(each_do, clientfd)
if__name__ == '
__main__':
tcp_server()
協程巢狀協程
import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...
9 協程 協程理論
本節的主題是基於單執行緒來實現併發,即只用乙個主線程 很明顯可利用的cpu只有乙個 情況下實現併發,為此我們需要先回顧下併發的本質 切換 儲存狀態 ps 在介紹程序理論時,提及程序的三種執行狀態,而執行緒才是執行單位,所以也可以將上圖理解為執行緒的三種狀態cpu正在執行乙個任務,會在兩種情況下切走去...
python協程與非同步協程
在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...