[原]初心pythonコラボレーション(ロックレス生産者&消費者)

1350 ワード

引用:先日少し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()のたびに対応するタスクに値が渡されます.
まとめ:コラボレーションは確かに軽量レベルのスレッドであり、スケジューリングポリシーはいつ「メッセージ」を送信するかによって異なります.その具体的な実装については、ソースコードを見たことがありません.むやみに評論してはいけない
比較的良いオープンソースコーディネーターeventlet|greenletなど