協程: 協程,又稱微線程,纖程。英文名Coroutine。 可以在不同的函數間切換,而且切換的次數和時間都是由用戶自己確定的。 協程的幾種實現方式: (1)使用生成器yield實現。 如果不瞭解生成器可以閱讀我的另一篇文章:python生成器的簡單理解 下麵就來寫一個簡單的協程程式。 這段代碼的執行 ...
協程:
協程,又稱微線程,纖程。英文名Coroutine。
可以在不同的函數間切換,而且切換的次數和時間都是由用戶自己確定的。
協程的幾種實現方式:
(1)使用生成器yield實現。 如果不瞭解生成器可以閱讀我的另一篇文章:python生成器的簡單理解
下麵就來寫一個簡單的協程程式。
1 import time 2 def test1(): 3 while True: 4 print("1") 5 yield None 6 def test2(): 7 while True: 8 print("2") 9 yield None 10 if __name__ == '__main__': 11 while True: 12 next(test1()) 13 time.sleep(2) 14 next(test2()) 15 time.sleep(2)
這段代碼的執行效果就是交替輸出1,2。為什麼會出現這種情況呢?瞭解過生成器你就會知道如果在一段代碼的執行過程中遇到了yield,那麼函數就會結束執行,直到下一次再次調用next。所以你看到下麵的圖片就知道為什麼會出現1,2交替輸出的情況了。這就是協程。
(2)greenlet
greenlet模塊需要下載 pip install greenlen
1 from greenlet import greenlet 2 import time 3 def test1(): 4 while True: 5 print("1") 6 g2.switch() 7 time.sleep(2) 8 def test2(): 9 while True: 10 print("2") 11 g1.switch() 12 time.sleep(2) 13 g1 = greenlet(test1) 14 g2 = greenlet(test2) 15 g1.switch()
(3)gevent 同樣gevent需要下載
1 import gevent 2 def f(n): 3 for i in range(n): 4 print(i) 5 g1 = gevent.spawn(f, 5) 6 g2 = gevent.spawn(f, 5) 7 g3 = gevent.spawn(f, 5) 8 g1.join() 9 g2.join() 10 g3.join()
gevent的強大之處是他不需要人工切換,能夠自動切換,而且他還有很多強大的功能,這裡就不一一列舉了,想更深瞭解可以去網上找關於gevent專門的文章。