2

この愚かな初心者の質問で申し訳ありませんが、非同期 I/O の概念を理解するのに本当に問題があります。コールバックやその他の複雑なことについては話していません。「Python がコードを実行する方法」の冒頭を理解したいだけです。

だからここに私が理解したい例があります

class Foo()
    take a user input # line 1
    seek for this input from the database # line 2
    make some operation using the database output # line 3
    make an output to the client and show the message to the page # line 4

たとえば、ユーザーが Tornado を使用し、サーバー上でコードを実行する場合、url が class に一致するページを要求する4 つのクライアントFooがあるとします。次に、Python がコードを実行する方法。

すなわち; Pythonでは、Script言語なので、すべての行が実行されて値が返されますか? そのため、ユーザー 1に対して行 1を実行してから停止し、残りのクライアントでクライアント 2に対して行 1を提供し、その後行 2などにスキップしますか?

4

2 に答える 2

2

質問はpythonとはあまり関係ありません。それはむしろ、非同期の python フレームワーク (つまりトルネード) に関する質問です。

tornado のクライアントは非同期で処理されます。これは、サーバーがクライアントの要求を処理し、非同期アクションが実行される行 (例のデータベース クエリ -行 #2 ) にヒットすると、そこで実行が中断され、別のクライアントに切り替わることを意味します。データベースクエリが完了すると、それに関する通知がキューに送られ、クライアントは停止した時点からもう一度順番が実行されるのを待ちます (行 #3 )。

Tornado には、独自のクライアント実行パターンがあります。リアクターパターンといいます。基本的には、クライアントのキューをループし、必要に応じてそれらを処理することを意味します (つまり、要求がソケットを介して送信され、データベース クエリが終了します)。

このノンブロッキング ループは、Epollなどのオペレーティング システムのユーティリティを介して実行されます。

于 2012-10-08T10:37:46.007 に答える
1

あなたの質問は、pythonが処理する方法にもっと関係していると思いますmultithreading

インタープリターはプロセッサーの複数のコアを使用することはありませんが (一部の情報はこちらこちら)、他のスレッドが待機している間に別のスレッドを実行できるという意味で、マルチスレッドをサポートしていますI/O。上記の例では、 client1がデータベース呼び出し (行 #2 ) が戻るのを待っている間に、 client2 (行 #1 ) を処理できます。

「スクリプト言語なので、すべての行が実行されて値が返されますか?」について ……いえ、そんなことは思いつきません。ジェネレーターを使用して「すべての行の値を返す」などのことを行うことができますが、それはあなたが探しているものではないと思います。

于 2012-10-08T11:15:46.413 に答える