日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中的协程:greenlet和gevent

發布時間:2023/12/20 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。