gevent實現簡單的協程

2021-08-25 22:13:11 字數 2766 閱讀 7704

協程,又稱微執行緒。是指程式在執行執行緒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...