3.4.3協程
(1)協程: 又稱為微線程,使用者級線程, 在不開辟線程的基礎上可以完成多任務
(2)如何了解協程: 隻要在def裡面隻看到一個yield關鍵字那麼就可以了解為是一個協程
(3)學習協程的目的: 在單線程的基礎上完成多任務,多個任務按照一定順序交替執行
(4)定義、建立、啟動協程
import time
# 定義協程
def work1():
while True:
print("work1…")
time.sleep(0.2)
yield
# 定義協程
def work2():
while True:
print("work2…")
time.sleep(0.2)
yield
if __name__ == '__main__':
# 建立協程
g1 = work1()
g2 = work2()
while True:
# 啟動協程
next(g1)
next(g2)
(5)greenlet的使用
greenlet是對協程進行了封裝,能夠讓程式員更加清楚地知道協程如何切換執行
例如:
import greenlet
import time
# 任務1
def work1():
for i in range(10):
print("work1...")
time.sleep(0.2)
# 切換到協程2執行對應的代碼
g2.switch()
# 任務2
def work2():
for i in range(10):
print("work2...")
time.sleep(0.2)
# 切換到協程1執行對應的代碼
g1.switch()
if __name__ == '__main__':
# 建立協程
g1= greenlet.greenlet(work1)
# 建立協程
g2 = greenlet.greenlet(work2)
# 切換到協程1執行對應的任務
g1.switch()
(6)gevent的使用
import gevent
import time
from gevent import monkey
# 打更新檔,讓gevent能夠識别系統耗時操作,比如:time.sleep,網絡請求延時
# 打更新檔操作要先執行
monkey.patch_all()
# 任務1
def work1():
for i in range(10):
print("work1…")
time.sleep(0.2)
#gevent.sleep(0.2)
# 任務2
def work2():
for i in range(10):
print("work2…")
time.sleep(0.2)
#gevent.sleep(0.2)
if __name__ == '__main__':
# 建立協程并指派任務
g1 = gevent.spawn(work1)
# 建立協程并指派任務
g2 = gevent.spawn(work2)
# 主動讓線程等待兩個協程執行完成以後程式在退出
g1.join()
g2.join()
#也可寫成:
#gevent.joinall([g1, g2])
(7)程序、線程、協程對比
①程序是作業系統資源配置設定的基本機關
②線程是cpu排程的基本機關,排程那個線程,那個線程執行對應的代碼
③多程序開發比單程序多線程開發穩定性要強,但是多程序開發占用的資源更多
④程序之間不共享全局變量,線程之間共享全局變量,提示:多線程共享全局變量要注意資源競争的問題,解決辦法:互斥鎖,線程同步
⑤線程之間執行是無序的,協程是按照一定順序交替執行的
⑥開辟一個協程大概需要5k,開辟一個線程需要512k,開辟程序需要資源是最大的
⑦協程以後的使用場景: 網絡爬蟲,網絡請求
⑧三者之間的關系是:先有程序,程序裡面預設提供一個線程,線程裡面可以包含多個協程