48

私のプログラムには 2 つの整数があります。aそれらを「 」および「 」と呼びましょうb。それらを合計して、結果として別の整数を取得したいと思います。これらは通常の Pythonintオブジェクトです。不思議なんだけど; それらを Twisted と一緒に追加するにはどうすればよいですか? performAsynchronousAdditionどこかに特別な機能はありますか?が必要Deferredですか? 原子炉はどうですか?原子炉が関与していますか?

4

3 に答える 3

43

わかりました。

Twisted はCPU バウンドのタスクについては何もしませんが、これ には正当な理由があります。サブタスクの順序を変更することによって、コンピューティング バウンド ジョブをこれ以上高速化する方法はありません。可能な唯一のことは、コンピューティング リソースを追加することです。そして、その実装の微妙さのために、それでさえPythonではうまくいきません。

Twisted は、プログラムが「スタック」した場合に備えて、特別なセマンティクスとイベント ループ処理を提供します。ほとんどの場合、プロセスは別のマシンで実行され、ネットワーク接続を介してねじれたプロセスと通信します。とにかく待っているので、twisted はその間により多くのことを行うためのメカニズムを提供します。つまり、twisted はI/O バウンド タスクに並行性を提供します。

tl;dr: twisted はネットワーク コード用です。それ以外はすべて通常の python です。

于 2011-09-06T00:23:48.583 に答える
9

これはどう:

c = a + b

これは機能するはずであり、非同期で実行する必要はありません (かなり高速です)。

于 2011-09-06T00:14:12.017 に答える
-9

良い質問です。Twisted (または Python) には、少なくとも "a + b" を複数のコア (私の 8 コア i7) で生成する方法が必要です。

残念ながら、Python GIL はこれを防止します。つまり、CPU にバインドされたタスクだけでなく、1 つのコアがジョブを実行している間、他の 7 つのコアが何もしていない間、待機する必要があります。

注: より良い例は、「a() + b()」、または「fact(sqrt(a()**b())」などですが、重要な事実は、上記の操作が 1 つのコアをロックし、 GILは、その操作中にPythonが他のことをするのをほとんど防ぎます。これは数ミリ秒になる可能性があります...

于 2013-12-16T05:49:30.780 に答える