python 協程之yield


協程,又叫微線程或者纖程。它是比線程更為細小的線程,微線程的名字由此得來。只支持python 3.4以上的版本,不過建議使用python 3.6版本.

優點:

  • 使用高並發、高擴展、低性能的;一個CPU支持上萬的協程都不是問題。所以很適合用於高並發處理

  • 無需上下文的切換開銷

缺點:

  • 無法利用計算機多核優勢

一般情況下,實現協程並發有三種方式

  • yield(簡單協程)

  • asyncio(Python自帶)

  • greenlet(第三方庫)

  • gevent(第三方庫)

學過Python基礎的朋友們都知道,函數的返回值有兩種方式,一種是最常用的return,還有一種是yeild,雖然它是起到掛起的作用,但是依舊能返回值。

 

基本思路就是創建生成器然后獲取生成器並執行:

這就是最為簡單的協程的實現,異步IO的實現

import time
def func1():
    while True:
        print('正在執行:func1')
        yield
        time.sleep(2)
def func2():
    while True:
        print('正在執行:func2')
        yield
        time.sleep(2)
if __name__ == '__main__':
    for i in range(5):
        next(func1())
        next(func2())

 

 

 

在不開啟線程的基礎上,實現多個任務,協程是一個特殊的生成器

實現過程:

  • func1 生成器

  • func2 生成器

  • 獲取生成器

  • 運行生成器

帶yield的函數是一個生成器,而不是一個函數了,生成器有一個next函數,next相當於'下一步',這一次的next開始的地方就是接着上一次next停止的地方執行,所以調用next的時候,並不會從fun函數執行,只是接着上一次停止的地方開始。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM