コントローラメソッド内で呼び出されるweb2pyアプリケーションで、時間のかかる処理とメモリを消費する処理を非同期で処理する必要があります。web2pyを使用した非同期バックグラウンドプロセス
私の具体的な使用例は、stdlib.subprocess
経由でプロセスを呼び出し、Webサーバーをブロックせずにプロセスが終了するのを待つことですが、別の方法があります。
- 実践例はプラスでしょう。
- サードパーティライブラリの推奨 を歓迎します。
- CRONスケジューリングは必須ではありません。
コントローラメソッド内で呼び出されるweb2pyアプリケーションで、時間のかかる処理とメモリを消費する処理を非同期で処理する必要があります。web2pyを使用した非同期バックグラウンドプロセス
私の具体的な使用例は、stdlib.subprocess
経由でプロセスを呼び出し、Webサーバーをブロックせずにプロセスが終了するのを待つことですが、別の方法があります。
バックグラウンドタスクのインスタンスを複数同時に起動する必要がある場合、ソリューションはタスクキューです。サードパーティのオプションを探しているなら、CeleryとRabbitMQについてよく聞きましたが、web2pyにはあなたのニーズに十分なit's own task queueシステムが含まれています。
どちらのツールでも、バックグラウンドプロセスで実行する操作をカプセル化する関数を定義します。タスクキューワーカーをオンラインにします。 web2pyのマニュアルとフォーラムでは、web2py cronシステムの@rebootステートメントを使ってこれを行うことができます。これはWebサーバーの起動時に起動されます。これが不十分な場合は、おそらく他の方法で作業を開始することができます。
コントローラではタスクをタスクキューに挿入し、必要なパラメータを関数の入力として渡します(バックグラウンド関数はコントローラと同じ環境では実行されないため、あなたが明示的に適切な値をタスク関数に渡さない限り、セッション、DBなど)。
ここで、バックグラウンド操作の出力をユーザーに取得します。タスクキューにタスクを挿入するときは、タスクの一意のIDを取得する必要があります。その後、タスク・キューのAPIを呼び出して指定されたタスクの状況をチェックするコントローラー・ロジック(AJAX呼び出しを予期するものか、タスクが完了するまでリフレッシュを続けるページのいずれか)を実装します。タスクのステータスが「終了」の場合は、データをユーザーに返します。そうでない場合は、待ってください。
これは予想よりも困難です。 stdlib.subprocess documentationのデッドロック警告に注意してください。あなたがブロッキングを気にしないなら、Popen.communicateを使うのは簡単です。ブロックを回避するには、スレッドからstdlib.subprocessを使用してプロセスを管理します。
サブプロセスを処理する私の好きな方法は、Twisted's spawnProcessを使用することです。しかし、Twistedを他のフレームワークとうまく組み合わせることは容易ではありません。
running tasks in the backgroundの本のセクションを参照してください。新しいschedulerを使用するか、手作りのキュー(email example)を作成することができます。また、web2py-celery pluginもありますが、どの状態にあるのかわかりません。
web2py-celeryプラグインの場合+1。 –
私は組み込みのタスクスケジューラは私が探していたものだと思います。 –