2017-05-12 14 views
0

私はeventlet.tpoolが役に立つのか理解しようとしています。ドキュメントでは、tpool.execute()を使用すると、ブロック機能を使用して新しいスレッドで実行することができます。ただし、tpool.execute()メソッド自体は、スレッドが完了するまでブロックされます。では、これはどのように役に立つのでしょうか?関数myfunc()をブロックして長時間実行していて、直接呼び出すとブロックされます。 tpool.execute(myfunc)の中で呼び出すと、tpool.execute(myfunc)呼び出しがブロックされます。違いは何ですか?イベントレットのtpoolはどのように役立ちますか?

私が推測できるのは、myfunc()が直接呼び出されると、このコルーチンがブロックされるだけでなく、他のコルーチンが実行されないことです。tpool.execute()を呼び出すと現在のコルーチンがブロックされますが、他のコルーチンも実行可能です。これは本当ですか?それ以外の場合は、tpoolがどのように役立つのかわかりません。

答えて

1

あなたは自分で答えを書いた、私はそれを言い換えることができます。

Eventlet、Gevent、Twisted、Asyncioおよび他の協同マルチタスクライブラリに関しては、すべてをブロックするという意味で「ブロッキング」という用語を使用しています。パッチが適用されていないtime.sleep(1)は、OSスレッドのセマンティクスではなく、呼び出し元のOSスレッドのみをブロックし、他のOSスレッドを続行できるようにするため、すべてのコルーチン/ greenthreadsをブロックします。

OSスレッドをブロックするものと、コルーチン/グレースドッグをブロックするものを区別するために、用語を「」とします。降伏する関数は、コルーチンの残りの部分を実行できるようにするものですが、(Pythonの実行セマンティクスのために)ブロックするのは呼び出し元のコルーチンのみです。

この強力な用語で武装したtpool.execute()は、コールをブロックして1つを返します。

eventlet.spawn(tpool.execute, fun, ...)と組み合わせると、呼び出し元のコルーチンもブロックされません。たぶんあなたはこれが役に立つ組み合わせだと思います。

パッチはいつでも歓迎します。イベントレットは多くの偉大な人々の努力を集約した素晴らしいライブラリです。

関連する問題