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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信...

發布時間:2025/7/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.協程
并發:切+保存狀態
單線程下實現并發:協程 切+ 保存狀態 yield
遇到io切,提高效率
遇到計算切,并沒有提高效率

檢測單線程下 IO行為 io阻塞 切
相當于騙操作系統 一直處于計算
協程:。。。
單線程下實現并發:根本目標:遇到IO就切,一個線程的整體IO降下來
程序用的cpu 時間長,就叫執行效率高
效率最高:多個進程 (多個cpu)
每個進程開多個線程
每個線程用到協程 (IO就切)
總結協程特點: 1 #并發執行 2 import time 3 4 def producer(): 5 g=consumer() 6 next(g) 7 for i in range(10000000): # 計算 8 g.send(i) 9 10 11 def consumer(): 12 while True: 13 res=yield 14 15 16 start_time=time.time() 17 producer() 18 stop_time=time.time() 19 print(stop_time-start_time) 20 21 #串行 22 import time 23 24 def producer(): 25 res=[] 26 for i in range(10000000): 27 res.append(i) 28 return res 29 30 31 def consumer(res): 32 pass 33 34 35 start_time=time.time() 36 res=producer() 37 consumer(res) 38 stop_time=time.time() 39 print(stop_time-start_time)

?

2.greenlet模塊
pip3 install greenlet
greenlet:可以很方便的切 但不能檢測到 遇到IO 切
greenlet 比yield 好 但是還是不好 遇到io不會切 1 from greenlet import greenlet 2 import time 3 4 def eat(name): 5 print('%s eat 1' %name) 6 time.sleep(10) # 遇到io 不會立即切 7 g2.switch('egon') 8 print('%s eat 2' %name) 9 g2.switch() 10 11 def play(name): 12 print('%s play 1' %name ) 13 g1.switch() 14 print('%s play 2' %name ) 15 16 17 g1=greenlet(eat) 18 g2=greenlet(play) 19 20 g1.switch('egon') # 第一次切 需要傳參數

?

3.gevent模塊
pip3 install gevent
gevent:封裝了greenlet模塊,但是他能檢測到io 自動切
只能檢測到gevent.sleep() gevent的IO阻塞
加上補丁后,就可以檢測到所有的IO 原理是:將阻塞變為非阻塞
from gevent import monkey;monkey.patch_all()
這種形式的協程 才能幫我們提升效率 從始至終 就一個線程
gevent.joinall([g1,g2]) 等待全部執行完

gevent 模塊:監測單線程下多個任務得IO行為實現遇到IO就自動切到另一個任務去執行
提升單線程運行效率
應用場景:單線程下多個任務io密集型
ftp io密集型 線程來回切 比os q切 小路高 1 from gevent import monkey;monkey.patch_all() # 一定要放在程序的開頭 檢測所以的io 將阻塞變成非阻塞 2 import gevent 3 import time 4 5 6 def eat(name): 7 print('%s eat 1' % name) 8 time.sleep(3) # 7s多一些 gevent 只識別 gevent 的 io操作 9 # gevent.sleep(3) # 4s 多一些 10 print('%s eat 2' % name) 11 12 13 def play(name): 14 print('%s play 1' % name) 15 time.sleep(4) 16 # gevent.sleep(4) 17 print('%s play 2' % name) 18 19 20 start_time=time.time() 21 g1=gevent.spawn(eat,'egon') 22 g2=gevent.spawn(play,'alex') 23 24 g1.join() 25 g2.join() 26 stop_time=time.time() 27 print(stop_time-start_time) 28 """ 29 egon eat 1 30 alex play 1 31 egon eat 2 32 alex play 2 33 4.001747369766235 34 35 """ 36 """ 37 egon eat 1 38 egon eat 2 39 alex play 1 40 alex play 2 41 7.0017828941345215 42 """ 43 """ 44 egon eat 1 45 alex play 1 46 egon eat 2 47 alex play 2 48 4.001675367355347 49 """ 50 51 from gevent import monkey;monkey.patch_all() 52 import gevent 53 import time 54 55 56 def eat(name): 57 print('%s eat 1' % name) 58 time.sleep(3) 59 print('%s eat 2' % name) 60 61 62 def play(name): 63 print('%s play 1' % name) 64 time.sleep(4) 65 print('%s play 2' % name) 66 67 68 g1=gevent.spawn(eat,'egon') # 異步操作 69 g2=gevent.spawn(play,'alex') 70 71 # time.sleep(5) # 得等到 全部執行完 72 73 # g1.join() # 等到 全部執行完 74 # g2.join() 75 76 gevent.joinall([g1,g2]) # 等到g1 g2 全部執行完 77 """ 78 egon eat 1 79 alex play 1 80 egon eat 2 81 alex play 2 82 """

?

4.gevent實現并發的套接字通信
# 500 客戶端同時 登錄 服務端:這里1個線程 抗住了 500個client
# 這里也說明了:單線程下面io問題降下來,效率大幅度提高

說明
使用:多進程
多線程
一個線程io 問題解決了 效率大大得提高
服務端: 1 #基于gevent實現 2 from gevent import monkey,spawn;monkey.patch_all() 3 from socket import * 4 5 def communicate(conn): 6 while True: 7 try: 8 data=conn.recv(1024) 9 if not data:break 10 conn.send(data.upper()) 11 except ConnectionResetError: 12 break 13 14 conn.close() 15 16 def server(ip,port): 17 server = socket(AF_INET, SOCK_STREAM) 18 server.bind((ip,port)) 19 server.listen(5) 20 21 while True: 22 conn, addr = server.accept() 23 spawn(communicate,conn) # 這里沒必要加join 24 25 server.close() 26 27 if __name__ == '__main__': 28 g=spawn(server,'127.0.0.1',8090) 29 g.join() 客戶端: 1 from socket import * 2 from threading import Thread,currentThread 3 4 def client(): # 5 client=socket(AF_INET,SOCK_STREAM) 6 client.connect(('127.0.0.1',8090)) 7 8 9 while True: 10 client.send(('%s hello' %currentThread().getName()).encode('utf-8')) 11 data=client.recv(1024) 12 print(data.decode('utf-8')) 13 14 client.close() 15 16 # 500 客戶端同時 登錄 服務端:這里1個線程 抗住了 500個client 17 # 這里也說明了:單線程下面io問題降下來,效率大幅度提高 18 if __name__ == '__main__': 19 for i in range(500): # 500 客戶端同時 登錄 服務端:這里1個線程 抗住了 500個client 20 t=Thread(target=client) 21 t.start()

?

轉載于:https://www.cnblogs.com/mumupa0824/p/9401008.html

總結

以上是生活随笔為你收集整理的并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信...的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 91视频免费观看 | www.操| 久久视频在线观看 | 久久妇女 | 交专区videossex另类 | 女人下边被添全过视频 | 人人干夜夜操 | 中文字幕综合 | 国产精品一二三四五区 | 国产在线观看 | 免费无码av片在线观看 | 日本一区电影 | 青青草久久伊人 | 白丝美女被草 | 亚洲综合久久av一区二区三区 | 国产精品亲子伦对白 | 国产这里有精品 | 国产乱码精品一区二区三区忘忧草 | 日韩欧洲亚洲 | 国内偷拍一区 | 综合色视频 | 天堂精品一区 | 久久久久久久久久久久国产精品 | 又黄又爽的视频在线观看 | 国产毛片一区二区 | 日韩影视在线 | 97高清国语自产拍 | 狠狠操夜夜爽 | 麻豆视频在线观看免费网站黄 | 日本黄视频在线观看 | 国产成人三级在线播放 | 午夜影院试看 | 亚洲精品在线不卡 | ww黄色| 精品一区二区久久久久蜜桃 | 国产日韩av在线 | 欧美精品videos另类日本 | ass亚洲熟妇毛耸耸pics | 小日子的在线观看免费第8集 | 中文字幕人妻熟女人妻a片 麻豆91视频 | 女人下部全棵看视频 | 女女同性高清片免费看 | 久草久草久草 | 成年人黄色小视频 | 中文字幕人妻熟女在线 | 日本一品道 | 日韩欧美一区二区在线观看 | 亚洲a免费 | 新婚之夜玷污岳丰满少妇在线观看 | 亚洲女女做受ⅹxx高潮 | 黄色高清免费 | 国产曰肥老太婆无遮挡 | 国产精品欧美精品 | 日韩另类av| 日韩av片在线 | 免费99精品国产自在在线 | 91国内在线视频 | 久久一二三区 | 日韩精品麻豆 | 欧美熟妇精品黑人巨大一二三区 | 邻居少妇张开腿让我爽了在线观看 | 97在线公开视频 | 亚州中文 | 一久久久久 | 丝袜av网站 | 亚洲成人手机在线 | 黄色亚洲网站 | 国产一级黄 | 成人午夜影视 | 欧美日韩激情在线一区二区三区 | 精品免费视频一区二区 | 亚洲免费国产视频 | av有码在线观看 | 动漫3d精品一区二区三区乱码 | 日本特级黄色大片 | 嫩草视频91 | 久久精品2019中文字幕 | 一区二区三区欧美在线 | 色偷偷欧美| 国产十八熟妇av成人一区 | 国产精品久久久久久在线观看 | 日本japanese极品少妇 | 国产高清无密码一区二区三区 | 初尝人妻少妇中文字幕 | 91操视频| 福利视频在线看 | 影音先锋久久 | 久久人人爽人人爽人人片av高清 | 日本一区二区三区免费看 | 香蕉视频官网在线观看 | 久久婷色 | 亚洲精选在线观看 | 嫩草视频在线 | 欧美一二区视频 | 金鱼妻日剧免费观看完整版全集 | n0659极腔濑亚美莉在线播放播放 | mm视频在线观看 | 特级黄色网 | 久久六|