6

私はツイスト ライブラリを初めて使用し、python/twisted での操作が非同期で実行される方法を理解しようとしています。これまでのところ、GUI に似た (Qt または JavaScript) プラットフォームのみがイベント駆動型アーキテクチャを広く使用していると考えていました。

事実:

  • ねじれたプログラムは 1 つのスレッドで実行される = マルチスレッドなし
  • リアクターおよび遅延パターンが使用されます。コールバック/エラーバックが宣言され、すべての実行がリアクターのメイン ループによって制御されます。
  • 単一の CPU は、プロセス間でリソースを共有するため、真に並列に何かを実行することはできません。コードの並列実行とは、プログラミング プラットフォーム (python、javascript など) が複数の一連の操作を実行することを意味します (これは実行可能であり、たとえば、マルチスレッドの使用)

質問1

Python は、オペレーティング システムの高レベルのラッパーと見なすことができます。非同期操作の処理を提供する OS 関数 (または C 関数) は何ですか? いずれかがあります?

質問2

Q1 は、twisted の非同期性は Javascript のような真の非同期性ではないという考えに私を導きます。たとえば、JavaScript で 3 つの異なるボタンを提供し、それらにコールバック関数をアタッチして、3 つのボタンすべてをクリックすると、3 つのコールバックが並行して実行されます。まさに平行。

Twisted では、私が理解している限り、それは真の非同期性ではありません。たとえば、操作が並列に実行されないため (コードに関しては、事実 3 で述べたように)、代わりに近似非同期性と言えます。Twisted では、コードの最初の n 行 (プロトコル、ファクトリ、接続などを定義する) は、システム全体が起動したときに何が起こるかの宣言です。これまでのところ何も実行されません。実際の実行が開始されてから、reactor.run()が起動されます。リアクターのランタイムが単一のwhile Trueイベントを繰り返すループ。リアクタは、待機中のタスクをチェックして処理し、その結果をキュー (コールバックまたはエラーバックのいずれか) に送り返します。次のループ実行では、それらはさらに 1 ステップ処理されます。したがって、遅延実行は実際には線形です (ただし、外部からは並列に実行されたように見えます)。私の解釈は正しいですか?

誰かが私の質問に答えたり、twist/python プラットフォームで非同期性がどのように機能するか、またオペレーティング システムとどのように関連しているかを説明していただければ幸いです。事前に良い説明をありがとう!

編集: 非同期性を説明する記事へのリンクは大歓迎です!

4

3 に答える 3

5

多くの用語をより正確に定義し、あなたの事実に異議を唱えずにこれについて話すのは難しいですが、ここに私の試みがあります:

質問1:

Tryman selectは、おおよそ Twisted の実装方法です。これは、オペレーティング システムに複数のものを一度に監視し、それらのいずれかが起動したときにアプリケーションに通知する (複数のものをブロックする) ように指示する方法です。

質問2:

ええ、ほとんど - しかし、Javascript については間違っています。それは Twisted と同じです。

于 2013-10-06T17:21:17.743 に答える
2

私は PyCon 2012 で、まさにこのトピックについて 30 分間の講演を行いまし た。こちらからオンラインで視聴できます。

于 2013-10-07T17:52:39.133 に答える
2

トーマスはすでに最初の質問に答えていますが、質問 2 に何か追加したいと思います。(2 番目の) 質問の言い方からすると、多くの人が非同期性を誤解しているようです。非同期をマルチプロセッシングと混同しないでください。非同期性の例を次に示します。完了する必要がある 2 つのタスクがあるとします。1) ディスクからファイルを読み取る 2) メモリ内の整数を合計する

同期システムでは、これらのタスクは一度に 1 つずつ実行され、操作の結果を待ってから次のタスクに進みます。非同期システムでは、各操作を開始し、それぞれの完了を定期的にチェックします。(これが、気の利いた選択操作の出番です) 詳細については、この wiki ページを参照してください: http://en.wikipedia.org/wiki/Asynchronous_I/O

したがって、実際には特定の時点で 1 つのスレッドしか実行されていないシングルコア システムでも、非同期システムを使用して、時間のかかるタスク (上記の例ではファイルの読み取り) がスパナをスローしないようにすることができます。作業を迅速に完了できるタスクの作業中 (メモリ内のいくつかの整数を合計する)

(ちなみに、Twisted は新しいスレッドの生成をサポートしています。 http://twistedmatrix.com/documents/11.0.0/core/howto/threading.html )

于 2013-10-06T18:48:16.910 に答える