概念:使用者層面在乙個執行緒中進行多工切換的機制, 比執行緒更加輕量級 實現併發量更大
協程的使用:
使用第三方庫: gevent
gevent 是乙個基於協程的 python 網路庫, 在遇到 io 阻塞時, 程式會自動進行切換, 可以讓我們用同步的放肆寫非同步 io **
協程的使用:
from gevent import monkey
monkey.patch_all(
)# patch 替換破解 替換那些預設能夠阻塞當前協程的** .recv() .accept() time.sleep() 讓協程能狗自動切換
import time
# import gevent
deffunc
(no)
:for i in
range(5
):print
("當前協程正在執行"
, no)
time.sleep(1)
if __name__ ==
"__main__"
:# 1. 建立並且執行乙個協程; 在協程中執行 func 函式 引數1 是協程執行的函式名, 2.... 都是這個函式需要的引數
g1 = gevent.spawn(func,
1111
) g2 = gevent.spawn(func,
2222
) g3 = gevent.spawn(func,
3333
)# 2. 等待協程執行完成
g1.join(
) g2.join(
) g3.join(
) gevent.joinall(
[g1, g2, g3]
)
== 協程案例==
# from gevent import monkey
# monkey.patch_all()
from urllib.request import urlopen
import gevent
import time
defdown_html
(url)
:print
( html_data = urlopen(url)
.read(
)print(%
(url,
len(html_data)))
if __name__ ==
"__main__"
: begin = time.time(
)# 建立協程
g1 = genvent.spawn(down_html,
"") g2 = genvent.spawn(down_html,
"") g3 = genvent.spawn(down_html,
"")# 等待協程執行完成
genvent.joinall(
[g1, g2, g3]
) end = time.time(
)print
("時間"
, end-begin)
協程巢狀協程
import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...
python協程與非同步協程
在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...
9 協程 協程理論
本節的主題是基於單執行緒來實現併發,即只用乙個主線程 很明顯可利用的cpu只有乙個 情況下實現併發,為此我們需要先回顧下併發的本質 切換 儲存狀態 ps 在介紹程序理論時,提及程序的三種執行狀態,而執行緒才是執行單位,所以也可以將上圖理解為執行緒的三種狀態cpu正在執行乙個任務,會在兩種情況下切走去...