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