[原]初學python 協程(無鎖生產者&消費者)


引言:前幾天看了一點InfoQ上大神們很多的總結,服務編程范式以這樣的方式進化多進程--->多線程--->非阻塞--->協程。

說說協程,找了一些關於GreenLet的資料,協程也稱作微線程,是比線程還小的一種執行體。

線程確實執行體就是一個函數,在用戶空間看來,但是在內核中線程也是一個進程,LWP所謂的輕量級進程,線程也存在自己的上下文運行環境。

協程不同於線程的是,線程是搶占式的調度,而協程是協同式的調度,也就是說,協程需要自己做調度。

看看一個簡單的消費者&生產者模型的python代碼:

def coroutine(func):
    def ret():
        f = func()
        f.next()
        return f
    return ret



@coroutine
def consumer():
    print "Wait to getting a task"
    while 1:
        n = (yield)
        print "Got %s",n



import time
def producer():
    c = consumer()
    while 1:
        time.sleep(1)
        print "Send a task to consumer"
        c.send("task")

if __name__ == "__main__":
    producer()

 

這里協程的調度是通過 send() 調用來傳遞任務,就是說,在producer執行期間,consumer是阻塞在 yield 表達式上。

每一次send()都會傳遞值給相應的任務給consumer.

總結:可以看出來,協程確實是一種輕量級的線程,調度策略取決於什么時候發送"消息"。關於其具體的實現還沒有看過源碼。不能妄加評論

比較好的開源協程庫 eventlet | greenlet 等

 

 

 


免責聲明!

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



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