引言:前幾天看了一點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 等