その下に新しいスレッドが生成されますか?従来の Web サーバーが HTTP 要求を処理するスレッドを生成し、Twisted Web を使用して mysql にクエリを実行するたびに Deferred() を生成する必要がある場合、どこにメリットがありますか? スレッドを生成しても意味がないように見えますが、どのように実装されていますか?
2 に答える
他の人が言ったようDeferred
に、それ自体は値の約束であり、値が到着したとき (または値の取得に失敗したとき) に行うべきことのリストです。
それらがどのように機能するかは次のとおりです。一部の関数は、返したい値がまだ準備されていないことを認識しています。そのため、Deferred を準備し、準備ができたら、その Deferred が値でコールバック(「起動」) されるように何らかの方法で手配します。その 2 番目の部分が、混乱を引き起こしている可能性があります。Deferred 自体は、いつ、どのように解雇されるかを制御しません。それは、Deferred を作成したものの責任です。
Twisted アプリ全体のコンテキストでは、ほぼすべてがイベントベースであり、イベントはリアクターによって管理されます。コードが usedtwisted.web.client.getPage()
だとすると、http fetch の結果で起動される Deferred が追加されます。これが意味することはgetPage()
、http サーバーとの tcp 会話を開始し、基本的にリアクターにハンドラーをインストールして、「この tcp 接続でトラフィックが発生した場合は、この Protocol オブジェクトのメソッドを呼び出す」ということです。Protocol オブジェクトは、要求したページ全体を受信したことを確認すると、Deferred を起動し、その Deferred のコールバック チェーンを介して独自のコードが呼び出されます。
したがって、すべてがコールバックとフックです。これが、別のスレッドでない限り、Twisted アプリでブロック コードを使用してはならない理由です。これは、他のすべての処理も停止するためです。
それは役に立ちますか?
Pythonの ADeferred
は何もしません。スレッドやプロセスなどとは何の関係もありません。
これは、将来のデータが配信されるという約束と、そのデータが受信コールバック関数にどのようにマップされるかを抽象化したものです。
Twisted で非同期動作を実現する方法は、Twisted のドキュメントとニュースグループのアーカイブに詳しく記載されています。簡単な Google 検索で必要なものが見つかります。Deferred の実装とは関係ありません。それでも理解できない場合は、この回答へのコメントではなく、特定の情報について別の質問で質問する必要があります。
とは言っても、並行性に関する限り、Twisted は死んだようなものです。マルチコア プロセッサや、Twisted がスケーリングをやめたときに私が Twisted から移行した Erlang のようなものにスケーリングすることは決してありません。