4

これは少し奇妙に聞こえるかもしれませんが、Tornado が Future をタイムアウトでラップした後に実行を完了することは可能でしょうか?

だから、このようなもの:

try:
    result = yield gen.with_timeout(time.time() + 1, future)
except gen.TimeoutError as e:
    print('Timed out!')

したがって、このシナリオでは、futureタイムアウト前に完了しませんが、呼び出し可能なものは何でも実行し続けたいと思います。

別の言い方をすればgen.WaitIterator、ドキュメントで説明されているように、これを使用して一連の先物の結果を取得できるようにしたいと考えています。

各 Future の結果をできるだけ早く取得する必要がある場合、または他の Future がエラーを生成したとしても一部の Future の結果が必要な場合は、 を使用できますWaitIterator

これはまさに私が探しているものです。他のタスクよりも時間がかかるタスクがあるため、将来の各結果をできるだけ早く取得したいのですが、例外が 1 つあります。これらの遅いタスクは引き続き結果を生成する必要があるため、後でアクセスできます。

これは可能ですか?

4

1 に答える 1

3

with_timeout基になる をキャンセルしないFutureため、再利用できます。

future = do_something_async()
while True:
    try:
        result = yield gen.with_timeout(timedelta(seconds=1), future)
        break
    except gen.TimeoutError:
        print('tick')

前の呼び出しが完了するまで再度WaitIterator呼び出してはならないため、これを組み合わせるのは少し注意が必要です。WaitIterator.next

Tornado 4.2 で導入された Queue クラスも考慮してください。これらは多くの場合、WaitIterator よりもクリーンなコードを生成できます (また、with_timeoutラッパーの代わりにタイムアウトのサポートが組み込まれています)。

于 2015-06-01T17:37:53.430 に答える