ホームページ  >  記事  >  バックエンド開発  >  高性能 Python プログラミング コルーチン (スタックレス)

高性能 Python プログラミング コルーチン (スタックレス)

高洛峰
高洛峰オリジナル
2016-10-18 10:05:101417ブラウズ

現在、同時 (並列ではない) プログラミングには、マルチプロセス、マルチスレッド、非同期、コルーチンの 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(&#39;url.txt&#39;)
    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 などの実装を参考にしてください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。