協程,又稱微執行緒。是指程式在執行執行緒a的時候如果碰到耗時操作,會自動切換到函式b執行,b碰到耗時操作自動切換回a。這一系列動作看起來像多執行緒,但是卻只有乙個執行緒執行。
優勢:
- 占用資源更少
多工占用資源排名 程序》執行緒》協程
- 執行效率極高,因為切換函式執行不是執行緒切換,而是程式本身控制,沒有執行緒需要占用的資源。所以和執行緒對比,任務越多的時候,協程的優勢越明顯。
協程擅長處理io密集型任務(耗時操作多),而不擅長處理計算密集型程式(耗時操作少)。
協**正實現多工核心:利用乙個任務延時的時候切換另乙個任務
使用gevent實現簡單的協程
import gevent 匯入包
變數名 = gevent.spawn(函式名, 引數) 建立協程物件,碰到耗時操作自動執行
import gevent
defrun
():"""執行函式"""
for i in range(5):
print("%d------%s" % (i, gevent.getcurrent()))
gevent.sleep(0.1) # 手動延時操作
defmain
(): g1 = gevent.spawn(run)
g2 = gevent.spawn(run)
g3 = gevent.spawn(run)
g1.join()
g2.join()
g3.join()
if __name__ == '__main__':
main()
執行結果:
0------"greenlet-0" at 0x5011b58: run>
0------"greenlet-1" at 0x51082d8: run>
0------"greenlet-2" at 0x5108360: run>
1------"greenlet-0" at 0x5011b58: run>
1------"greenlet-1" at 0x51082d8: run>
1------"greenlet-2" at 0x5108360: run>
2------"greenlet-0" at 0x5011b58: run>
2------"greenlet-1" at 0x51082d8: run>
2------"greenlet-2" at 0x5108360: run>
3------"greenlet-0" at 0x5011b58: run>
3------"greenlet-1" at 0x51082d8: run>
3------"greenlet-2" at 0x5108360: run>
4------"greenlet-0" at 0x5011b58: run>
4------"greenlet-1" at 0x51082d8: run>
4------"greenlet-2" at 0x5108360: run>
jionall
gevent.joinall()方法會等待所有傳入的greenlet協程執行結束後再退出,而不用每個物件都手動寫join方法。
使用方法:
gevent.joinall([包含建立協程物件的列表])
**:
import gevent
defrun
():"""執行函式"""
for i in range(5):
print("%d------%s" % (i, gevent.getcurrent()))
gevent.sleep(0.1) # 手動延時操作
defmain
(): join_list = [gevent.spawn(run), gevent.spawn(run), gevent.spawn(run)]
gevent.joinall(join_list)
if __name__ == '__main__':
main()
執行結果:
0------"greenlet-0" at 0x5821b58: run>
0------"greenlet-1" at 0x59082d8: run>
0------"greenlet-2" at 0x5908360: run>
1------"greenlet-0" at 0x5821b58: run>
1------"greenlet-1" at 0x59082d8: run>
1------"greenlet-2" at 0x5908360: run>
2------"greenlet-0" at 0x5821b58: run>
2------"greenlet-1" at 0x59082d8: run>
2------"greenlet-2" at 0x5908360: run>
3------"greenlet-0" at 0x5821b58: run>
3------"greenlet-1" at 0x59082d8: run>
3------"greenlet-2" at 0x5908360: run>
4------"greenlet-0" at 0x5821b58: run>
4------"greenlet-1" at 0x59082d8: run>
4------"greenlet-2" at 0x5908360: run>
gevent實現協程
1 yield實現 import time def task 1 while true print 1 time.sleep 0.1 yield def task 2 while true print 2 time.sleep 0.1 yield def main t1 task 1 建立迭代器 t...
使用協程(gevent 實現請求
協程,又稱微執行緒。英文名coroutine。協程最大的優勢就是協程極高的執行效率。因為子程式切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。第二大優勢就是不需要多執行緒的鎖機制,因為只有乙個執行緒,也不存在同時寫變數衝突,在...
Python使用gevent實現協程
coding utf8 import requests import gevent from gevent import monkey monkey.patch all 用於將標準庫中大部分阻塞式呼叫修改為協作式執行 def fetch url print get format url respon...