2

イベント ループ (NodeJS など) に関しては、ブロック コードが罪であることは理解していますが、グリーンレット (グリーン スレッドであると私は信じています) の場合はどうでしょうか? ブロッキング関数を呼び出すコードの実行に問題はありますか?

4

2 に答える 2

7

geventによって提供されるイベントループのないGreenlet自体は、非常に原始的です。1つのグリーンレット内からのブロック呼び出しは、すべてのグリーンレットをブロックします。これは、グリーンレットだけではIO操作を生成する機能がなく、スケジューラーもないためです。GeventのソケットとファイルIOのモンキーパッチは、データベースライブラリがPythonで記述されており、ソケットを使用している場合、データベースでも非ブロッキングIOを有効にするのに一般的に十分です。または、ライブラリに自分でパッチを適用することもできます。

于 2012-05-05T00:21:44.627 に答える
4

イベントループをブロックする関数の呼び出しはもちろん問題です。他のグリーンスレッドがこの関数の終了を待っているからです。
しかし、Geventを使用すると、ブロッキング関数を呼び出すことができます。Gevent は、Python の一般的なブロック機能にパッチを当てます。プログラムの最初にこれを書くと、Gevent はすべてのブロッキング関数にパッチを当てます:

geventインポートモンキーから
monkey.patch_all()
于 2012-04-18T03:47:13.907 に答える