2017-09-10 18 views
0

私はTornado Asyncフレームワークを使用してREST Webサーバーを実装しています。Tornadoでの非同期バックグラウンドタスクの実行

同じサーバーのバックグラウンドで高CPU負荷の定期的なタスクを実行する必要があります。

低優先度定期タスクです。すべてのアイドル状態のコアで常時実行する必要がありますが、Webサーバーのパフォーマンスに影響を与えたくありません(HTTP要求の負荷が高い場合、優先順位は低くなります)。

私はトルネードIOLoop APIでこれを行うことはできますか?

tornado.ioloop.PeriodicCallbackを使用して、定期的なバックグラウンドタスクを呼び出すことができます。しかし、この作業が計算量が多い場合、Webサービスにパフォーマンスの問題が発生する可能性があります。

答えて

1

トルネードは(又はasyncioパイソン3)、または他の任意の単一のプロセス・イベント・ループ系溶液CPU集約的なタスクに使用されるものではありません。 IO集中的なタスクにのみ使用してください。

「バックグラウンド」という単語は、結果を待っていないことを意味します(私は時々無人のタスクと呼んでいます)。さらに、バックグラウンドタスクがブロックする場合、アプリケーションの残りの部分は、要求ハンドラブロックと同じ方法で待機しなければならず、バックグラウンドを含む他の部分がブロックされます。

あなたはスレッドの使用を考えているかもしれませんが、これは解決策ではありません。GILのためです。

右の解決策は以下のとおりです。ウェブサーバから

+0

concurrent.futures.ProcessPoolExecutor感謝。私がWebサーバーから作業者を分離すると、Webサーバーに影響を与えるかどうかを気にせずに、同じサーバー上で作業者を実行させることはできません。したがって、別の独立したコアで別のプロセスを使用することをお勧めしますか? (私は今、トルネードがコアごとにプロセスを生成させるようにします) – ShaharA

+0

あなたの設定は何か分かりません。カーネルスケジューラはプロセス管理(とそのリソース)をかなりうまく扱いますが、もちろん各プロセスが他のプロセスにCPUやIOをもたらす可能性があります。ソリューションはcgroup(プレーンまたはドッカーのようなコンテナ)を使用することができます。繰り返しますが、重要な情報は、あなたが持っているリソースの量と、あなたがクリスタルボールが必要なテストなしで、ワーカー、Webサーバーがどれくらい必要としたかです。 – kwarunek

関連する問題