python并发编程之协程
?
python并發編程之協程
?
1、協程:
單線程實現并發
在應用程序里控制多個任務的切換+保存狀態
優點:
應用程序級別速度要遠遠高于操作系統的切換
缺點:
多個任務一旦有一個阻塞沒有切,整個線程都阻塞在原地
該線程內的其他的任務都不能執行了
?
一旦引入協程,就需要檢測單線程下所有的IO行為,
實現遇到IO就切換,少一個都不行,以為一旦一個任務阻塞了,整個線程就阻塞了,
其他的任務即便是可以計算,但是也無法運行了
?
2、協程序的目的:
想要在單線程下實現并發
并發指的是多個任務看起來是同時運行的
并發=切換+保存狀態
?
#串行執行 # import time # # def func1(): # for i in range(10000000): # i+1 # # def func2(): # for i in range(10000000): # i+1 # # start = time.time() # func1() # func2() # stop = time.time() # print(stop - start)?
#基于yield并發執行 # import time # def func1(): # while True: # print('func1') # yield # # def func2(): # g=func1() # for i in range(10000000): # print('func2') # i+1 # time.sleep(3) # next(g) # # # start=time.time() # func2() # stop=time.time() # print(stop-start)?對于單線程下,我們不可避免程序中出現io操作,但如果我們能在自己的程序中(即用戶程序級別,而非操作系統級別)控制單線程下的多個任務能在一個任務遇到io阻塞時就切換到另外一個任務去計算,這樣就保證了該線程能夠最大限度地處于就緒態,即隨時都可以被cpu執行的狀態,相當于我們在用戶程序級別將自己的io操作最大限度地隱藏起來,從而可以迷惑操作系統,讓其看到:該線程好像是一直在計算,io比較少,從而更多的將cpu的執行權限分配給我們的線程。
?協程的本質就是在單線程下,由用戶自己控制一個任務遇到io阻塞了就切換另外一個任務去執行,以此來提升效率。為了實現它,我們需要找尋一種可以同時滿足以下條件的解決方案:
?
#1. 可以控制多個任務之間的切換,切換之前將任務的狀態保存下來,以便重新運行時,可以基于暫停的位置繼續執行。#2. 作為1的補充:可以檢測io操作,在遇到io操作的情況下才發生切換?
#pip3 install gevent # from gevent import monkey,spawn;monkey.patch_all() # import time # # def eat(name): # print('%s eat 1' %name) # time.sleep(3) # print('%s eat 2' %name) # # def play(name): # print('%s play 1' %name) # time.sleep(1) # print('%s play 2' %name) # # start=time.time() # g1=spawn(eat,'egon') # g2=spawn(play,'zmy') # # g1.join() # g2.join() # print(time.time() - start) # print(g1) # print(g2)from gevent import monkey,spawn;monkey.patch_all() from threading import current_thread import timedef eat():print('%s eat 1' %current_thread().name)time.sleep(3)print('%s eat 2' %current_thread().name)def play():print('%s play 1' %current_thread().name)time.sleep(1)print('%s play 2' %current_thread().name)g1=spawn(eat,) g2=spawn(play,)print(current_thread().name) g1.join() g2.join()?
?
轉載于:https://www.cnblogs.com/hanbowen/p/9325701.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的python并发编程之协程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3YAdmin-专注通用权限控制与表单的
- 下一篇: Confluence 6 手动安装语言包