現在、同時 (並列ではない) プログラミングには、マルチプロセス、マルチスレッド、非同期、コルーチンの 4 つの方法があることは誰もが知っています。
Python のマルチプロセス プログラミングには C 風の os.fork があり、もちろん、より高度なカプセル化されたマルチプロセス標準ライブラリもあります。以前に書いた Python の高可用性プログラミング手法 http://www.cnblogs.com。 /hymenz/ p/3488837.html は、nginx のマスター プロセスとワーカー プロセス間の信号処理メソッドと同様の信号処理メソッドを提供し、ビジネス プロセスの終了がメイン プロセスによって確実に検知されるようにします。
マルチスレッドプログラミングPythonにはスレッドとスレッドがあります。Linuxでのいわゆるスレッドは、実際にはLWPの軽量プロセスであり、LWPに関しては、COW(コピーオン)。 write)、fork、vfork、clone などについてはさらに詳しい情報があるため、ここでは詳しく説明しません。
Linux では、select、poll、epoll という 3 つの主な非同期実装があります。非同期はこの記事の焦点ではありません。
コルーチンについて話すときは、最初に例を見てみましょう:
#coding=utf-8 import time import sys # 生产者 def produce(l): i=0 while 1: if i < 5: l.append(i) yield i i=i+1 time.sleep(1) else: return # 消费者 def consume(l): p = produce(l) while 1: try: p.next() while len(l) > 0: print l.pop() except StopIteration: sys.exit(0) l = [] consume(l)
上の例では、プログラムが product の yield i を実行すると、p.next を呼び出すとジェネレーターが返されます。 Custom () を実行すると、プログラムは実行を継続するために、Produce の yield i に戻り、要素が l に追加され、p.next() が StopIteration 例外を発生させるまで l.pop() を出力します。
上記の例から、コルーチンのスケジューリングはカーネルには見えず、コルーチンは協調的にスケジュールされるため、同時実行数が数万の場合、コルーチンのパフォーマンスがスレッドよりもはるかに高くなることがわかります。
import stackless import urllib2 def output(): while 1: url=chan.receive() print url f=urllib2.urlopen(url) #print f.read() print stackless.getcurrent() def input(): f=open('url.txt') l=f.readlines() for i in l: chan.send(i) chan=stackless.channel() [stackless.tasklet(output)() for i in xrange(10)] stackless.tasklet(input)() stackless.run()
コルーチンに関しては、greenlet、stackless、gevent、eventlet などの実装を参考にしてください。