如:
import time
defa()
:for i in
range(10
):yield
time.sleep(1)
defb()
:for i in
range(10
):yield
time.sleep(1)
a1 = a(
)b1 = b(
)while1:
next
(a1)
next
(b1)
由於yield的可以暫停函式的執行,也可以重新執行函式的特殊性,可以實現協程
首先獲取所有的函式,也就是協程函式,
然後通過while 函式對各個協程進行輪流呼叫,由於函式中有yield,當執行到耗時操作的時候,我們進行yield返回暫停這個函式, 如果while迴圈就呼叫下乙個協程,當下乙個協程也遇到耗時操作的時候就yield一下停止函式的執行,當每個協程都遇到耗時操作的時候,while迴圈執行第二次,這時候,第乙個協程進行耗時操作,進行完遇到耗時操作的時候再yield,就這樣,不停的輪詢實現協程
gevent
gevent 是python中的乙個協程模組,可以使用gevent.aswpt(協程函式)
來建立乙個協程,使用gevent 中的 monkey 補丁可以在協程遇到io 操作堵塞的時候自動的切換到其他的協程中去
import gevent
import requests
from gevent import monkey
# 使用mokey.patch_all() 當協程遇到堵塞的時候會自動的切換到其他協程中去
monkey.patch_all(
)defa1(
):for i in
range
(100):
print
("這是a1的輸出結果"
, i)
# 此時的requests.get 會遇到io操作
requests.get(
"")# gevent.sleep(2)
defa2()
:for i in
range
(100):
print
("這是a2的輸出結果"
, i)
requests.get(
"")# gevent.sleep(2)
defa3()
:for i in
range
(100):
print
("這是a3的輸出結果"
, i)
requests.get(
"")# gevent.sleep(2)
# 開啟協程並讓主線程等待協程
genve.joinall(
[gevent.spawn(a1)
,gevent.spawn(a2)
,gevent.spawn(a3)
])
Python yield 與 send 實現協程
我們來看看在函式內部含有yield語句達到的效果。首先,我們來看看以下 def foo while true x yield print value x g foo g是乙個生成器 next g 程式執行到yield就停住了,等待下乙個next g.send 1 我們給yield傳送值1,然後這個值...
協程巢狀協程
import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...
9 協程 協程理論
本節的主題是基於單執行緒來實現併發,即只用乙個主線程 很明顯可利用的cpu只有乙個 情況下實現併發,為此我們需要先回顧下併發的本質 切換 儲存狀態 ps 在介紹程序理論時,提及程序的三種執行狀態,而執行緒才是執行單位,所以也可以將上圖理解為執行緒的三種狀態cpu正在執行乙個任務,會在兩種情況下切走去...