2

その下に新しいスレッドが生成されますか?従来の Web サーバーが HTTP 要求を処理するスレッドを生成し、Twisted Web を使用して mysql にクエリを実行するたびに Deferred() を生成する必要がある場合、どこにメリットがありますか? スレッドを生成しても意味がないように見えますが、どのように実装されていますか?

4

2 に答える 2

3

他の人が言ったようDeferredに、それ自体は値の約束であり、値が到着したとき (または値の取得に失敗したとき) に行うべきことのリストです。

それらがどのように機能するかは次のとおりです。一部の関数は、返したい値がまだ準備されていないことを認識しています。そのため、Deferred を準備し、準備ができたら、その Deferred が値でコールバック(「起動」) されるように何らかの方法で手配します。その 2 番目の部分が、混乱を引き起こしている可能性があります。Deferred 自体は、いつ、どのように解雇されるかを制御しません。それは、Deferred を作成したものの責任です。

Twisted アプリ全体のコンテキストでは、ほぼすべてがイベントベースであり、イベントはリアクターによって管理されます。コードが usedtwisted.web.client.getPage()だとすると、http fetch の結果で起動される Deferred が追加されます。これが意味することはgetPage()、http サーバーとの tcp 会話を開始し、基本的にリアクターにハンドラーをインストールして、「この tcp 接続でトラフィックが発生した場合は、この Protocol オブジェクトのメソッドを呼び出す」ということです。Protocol オブジェクトは、要求したページ全体を受信したことを確認すると、Deferred を起動し、その Deferred のコールバック チェーンを介して独自のコードが呼び出されます。

したがって、すべてがコールバックとフックです。これが、別のスレッドでない限り、Twisted アプリでブロック コードを使用してはならない理由です。これは、他のすべての処理も停止するためです。

それは役に立ちますか?

于 2012-05-16T18:54:45.607 に答える
2

Pythonの ADeferredは何もしません。スレッドやプロセスなどとは何の関係もありません。

これは、将来のデータが配信されるという約束と、そのデータが受信コールバック関数にどのようにマップされるかを抽象化したものです。

これは非常によく文書化されています。

Twisted で非同期動作を実現する方法は、Twisted のドキュメントとニュースグループのアーカイブに詳しく記載されています。簡単な Google 検索で必要なものが見つかります。Deferred の実装とは関係ありません。それでも理解できない場合は、この回答へのコメントではなく、特定の情報について別の質問で質問する必要があります。

とは言っても、並行性に関する限り、Twisted は死んだようなものです。マルチコア プロセッサや、Twisted がスケーリングをやめたときに私が Twisted から移行した Erlang のようなものにスケーリングすることは決してありません。

于 2012-05-15T16:45:36.250 に答える