ユーザーが特定のジョブを実行できるようにする小さなダッシュボードを作成しています。私はDjango=を使用しているので、リンクをクリックしてジョブを開始し、ジョブが実行中であることを示すメッセージとともにページを彼に返すことができるようにしたいと思います。ジョブの結果後で彼にメールで送信されます。
subprocess.Popen
を使用することになっていると思いますが、よくわかりません。だから擬似コードで、ここに私がやりたいことがあります:
if job == 1:
run script in background: /path/to/script.py
return 'Job is running'
p = subprocess.Popen([sys.executable, '/path/to/script.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
これにより、サブプロセスがバックグラウンドで開始されます。スクリプトは正常に実行され続けます。
ドキュメントを読む here 。
メッセージキューを介してこれを実行することは、長期的なスケーリングについて考えている場合に間違いなく進むべき方法です。バックグラウンドで常に実行されているキューにメッセージを送信し、さまざまな種類のメッセージを処理するジョブハンドラーを記述します。
Djangoを使用しているので、 Beanstalkd はかなり適していると思います。 これは この件に関するかなり素晴らしいチュートリアルです。その記事の最初のコメントにもいくつかの良いヒントがあります。
個人的には、Erlangで記述されたカスタムインメモリキューサーバーと、Cで記述されたPythonバインディングを使用しています。ただし、 redis は、将来のキューイング/メッセージングのニーズ。お役に立てれば!
subprocess.Popenはまさにあなたが探しているものです。
サブプロセスと親の間で大量の情報の通信を開始したい場合は、スレッド、またはTwistedのようなRPCフレームワークを検討することをお勧めします。
しかし、おそらくそれらはあなたのアプリケーションにとって重すぎる。