Python 協程之 Gevent 模塊

      網友投稿 976 2025-03-31

      Gevent模塊

      安裝:pip3 install gevent

      Gevent 是一個第三方庫,可以輕松通過gevent實現并發同步或異步編程,在gevent中用到的主要模式是Greenlet, 它是以C擴展模塊形式接入Python的輕量級協程。 Greenlet全部運行在主程序操作系統進程的內部,但它們被協作式地調度。

      用法介紹:

      g1=gevent.spawn(func,1,,2,3,x=4,y=5)創建一個協程對象g1,spawn括號內第一個參數是函數名,如eat,后面可以有多個參數,可以是位置實參或關鍵字實參, 都是傳給函數eat的 g2=gevent.spawn(func2) g1.join()?#等待g1結束 g2.join()?#等待g2結束 #或者上述兩步合作一步:gevent.joinall([g1,g2]) g1.value#拿到func1的返回值

      例:遇到io 主動切換

      import?gevent def?eat(name): ????print('%s?eat?1'?%name) ????gevent.sleep(2) ????print('%s?eat?2'?%name) def?play(name): ????print('%s?play?1'?%name) ????gevent.sleep(1) ????print('%s?play?2'?%name) g1=gevent.spawn(eat,'egon') g2=gevent.spawn(play,name='egon') g1.join() g2.join() #或者gevent.joinall([g1,g2]) print('主')

      上例gevent.sleep(2)模擬的是gevent可以識別的io阻塞,而time.sleep(2)或其他的阻塞,gevent是不能直接識別的需要用下面一行代碼,打補丁,就可以識別了

      from?gevent?import?monkey;monkey.patch_all() import?gevent import?time def?eat(): ????print('eat?food?1') ????time.sleep(2) ????print('eat?food?2') def?play(): ????print('play?1') ????time.sleep(1) ????print('play?2') g1=gevent.spawn(eat) g2=gevent.spawn(play) gevent.joinall([g1,g2]) print('主')

      我們可以用threading.current_thread().getName()來查看每個g1和g2,查看的結果為DummyThread-n,即假線程

      查看threading.current_thread().getName():

      from?gevent?import?monkey;monkey.patch_all() import?threading import?gevent import?time def?eat(): ????print(threading.current_thread().getName()) ????print('eat?food?1') ????time.sleep(2) ????print('eat?food?2') def?play(): ????print(threading.current_thread().getName()) ????print('play?1') ????time.sleep(1) ????print('play?2') g1=gevent.spawn(eat) g2=gevent.spawn(play) gevent.joinall([g1,g2]) print('主')

      Gevent之同步與異步

      from?gevent?import?spawn,joinall,monkey;monkey.patch_all() import?time def?task(pid): ????""" ????Some?non-deterministic?task ????""" ????time.sleep(0.5) ????print('Task?%s?done'?%?pid) def?synchronous():??#?同步 ????for?i?in?range(10): ????????task(i) def?asynchronous():?#?異步 ????g_l=[spawn(task,i)?for?i?in?range(10)] ????joinall(g_l) ????print('DONE') if?__name__?==?'__main__': ????print('Synchronous:') ????synchronous() ????print('Asynchronous:') ????asynchronous() #??上面程序的重要部分是將task函數封裝到Greenlet內部線程的gevent.spawn。 #??初始化的greenlet列表存放在數組threads中,此數組被傳給gevent.joinall?函數, #??后者阻塞當前流程,并執行所有給定的greenlet任務。執行流程只會在?所有greenlet執行完后才會繼續向下走。

      Gevent之應用舉例一

      通過gevent實現單線程下的socket并發

      注意 :from gevent import monkey;monkey.patch_all()一定要放到導入socket模塊之前,否則gevent無法識別socket的阻塞

      server:

      from?gevent?import?monkey;monkey.patch_all() from?socket?import?* import?gevent #如果不想用money.patch_all()打補丁,可以用gevent自帶的socket #?from?gevent?import?socket #?s=socket.socket() def?server(server_ip,port): ????s=socket(AF_INET,SOCK_STREAM) ????s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) ????s.bind((server_ip,port)) ????s.listen(5) ????while?True: ????????conn,addr=s.accept() ????????gevent.spawn(talk,conn,addr) def?talk(conn,addr): ????try: ????????while?True: ????????????res=conn.recv(1024) ????????????print('client?%s:%s?msg:?%s'?%(addr[0],addr[1],res)) ????????????conn.send(res.upper()) ????except?Exception?as?e: ????????print(e) ????finally: ????????conn.close() if?__name__?==?'__main__': ????server('127.0.0.1',8080)

      Python 協程之 Gevent 模塊

      clent:

      from?socket?import?* client=socket(AF_INET,SOCK_STREAM) client.connect(('127.0.0.1',8080)) while?True: ????msg=input('>>:?').strip() ????if?not?msg:continue ????client.send(msg.encode('utf-8')) ????msg=client.recv(1024) ????print(msg.decode('utf-8'))

      多線程并發多個客戶端:

      from?threading?import?Thread from?socket?import?* import?threading def?client(server_ip,port): ????c=socket(AF_INET,SOCK_STREAM)?#套接字對象一定要加到函數內,即局部名稱空間內,放在函數外則被所有線程共享,則大家公用一個套接字對象,那么客戶端端口永遠一樣了 ????c.connect((server_ip,port)) ????count=0 ????while?True: ????????c.send(('%s?say?hello?%s'?%(threading.current_thread().getName(),count)).encode('utf-8')) ????????msg=c.recv(1024) ????????print(msg.decode('utf-8')) ????????count+=1 if?__name__?==?'__main__': ????for?i?in?range(500): ????????t=Thread(target=client,args=('127.0.0.1',8080)) ????????t.start(

      軟件開發 人工智能 云計算 機器學習

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel表格中使用單變量求解分析數據的方法(Excel單變量分析)
      下一篇:Excel讓帶有小數點的數字以小數點對齊讓數據顯示更美觀(excel 小數點對齊)
      相關文章
      亚洲美女视频免费| 亚洲宅男永久在线| 亚洲日本精品一区二区| 亚洲精品久久无码| 亚洲成人黄色在线观看| 久久亚洲精品成人| 亚洲国产成人一区二区精品区| 亚洲人成无码网站久久99热国产| 国产亚洲高清在线精品不卡| 亚洲最大天堂无码精品区| 久久国产亚洲精品| 在线综合亚洲欧洲综合网站| 亚洲一区二区三区深夜天堂| 亚洲国产成AV人天堂无码| 67pao强力打造67194在线午夜亚洲| 亚洲国产精品久久久久婷婷软件 | 亚洲精品亚洲人成在线观看下载| 国产亚洲精品2021自在线| 在线观看亚洲免费| 亚洲国产精品无码久久久久久曰 | 久久精品国产亚洲av天美18| 亚洲aⅴ无码专区在线观看春色 | 亚洲∧v久久久无码精品| 亚洲成av人片在线观看无码不卡| 亚洲高清国产拍精品26U| 亚洲国产日韩一区高清在线| 亚洲一区二区影院| 亚洲精品午夜久久久伊人| 亚洲另类视频在线观看| 亚洲av无码电影网| 亚洲日韩精品无码专区加勒比☆| 亚洲日本VA中文字幕久久道具| 亚洲日韩AV无码一区二区三区人| 亚洲AV成人一区二区三区观看 | 久久综合久久综合亚洲| 国产精品自拍亚洲| 浮力影院亚洲国产第一页| 国产成人亚洲综合色影视| 亚洲高清视频免费| 国产亚洲精品bv在线观看| 久久久亚洲精华液精华液精华液|