python中的协程:greenlet和gevent
生活随笔
收集整理的這篇文章主要介紹了
python中的协程:greenlet和gevent
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 協程是一中多任務實現方式,它不需要多個進程或線程就可以實現多任務。
1.通過yield實現協程:
代碼:
import time def A():while 1:print('------A-----')time.sleep(0.1)yield()def B():while 1:print('-------B-----')time.sleep(0.1)next(a)a = A()#全局變量 B()
執行結果:
-------B-----
------A-----
-------B-----
------A-----
-------B-----
------A-----
-------B-----
------A-----
-------B-----
------A-----
?
?
2.greenlet:
- yield能實現協程,不過實現過程不易于理解,greenlet是在這方面做了改進。
上代碼:
from greenlet import greenlet import timedef A():while 1:print('-------A-------')time.sleep(0.5)g2.switch()def B():while 1:print('-------B-------')time.sleep(0.5)g1.switch()g1 = greenlet(A) #創建協程g1 g2 = greenlet(B)g1.switch() #跳轉至協程g1上面代碼的原理是讓函數A和函數B,誰也別等誰,各自運行,誰有輸出就算誰的.
執行結果:
-------A------- -------B------- -------A------- -------B------- -------A------- ···3.gevent:
- greenlet可以實現協程,不過每一次都要人為的去指向下一個該執行的協程,顯得太過麻煩。python還有一個比greenlet更強大的并且能夠自動切換任務的模塊gevent
- gevent每次遇到io操作,需要耗時等待時,會自動跳到下一個協程繼續執行。
上代碼:
import geventdef A():while 1:print('-------A-------')gevent.sleep(1) #用來模擬一個耗時操作,注意不是time模塊中的sleepdef B():while 1:print('-------B-------')gevent.sleep(0.5) #每當碰到耗時操作,會自動跳轉至其他協程g1 = gevent.spawn(A) # 創建一個協程 g2 = gevent.spawn(B) g1.join() #等待協程執行結束 g2.join()執行結果:
-------A------- -------B------- -------B------- -------A------- -------B------- -------B------- -------A------- -------B------- -------B------- ···4.協程gevent完成回顯服務器:
import gevent from gevent import monkey,socketmonkey.patch_all() #有IO才做時需要這一句s = socket.socket(2,1) #用的都是gevent模塊中的socket,但用法一樣 s.setsockopt(1,2,1) s.bind(('',8080)) s.listen(1024)def func_accept():while 1:cs,userinfo = s.accept()print('來了一個客戶'+str(userinfo))g = gevent.spawn(func_recv,cs) #每當有用戶連接,增加一條協程def func_recv(cs):while 1:recv_data = cs.recv(1024)print(recv_data) #程誰堵塞了,便會跳轉至其他協程if len(recv_data) > 0:cs.send(recv_data)else:cs.close()breakg1 = gevent.spawn(func_accept) g1.join()?
- gevent的代碼風格和線程非常相似,運行出來后的效果也非常相似。
總結
以上是生活随笔為你收集整理的python中的协程:greenlet和gevent的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用gitkraken来push的流程
- 下一篇: Python中Function(函数)和