web-dev-qa-db-ja.com

Python)でスクリプトが完了するのを待たずに別のスクリプトを実行するにはどうすればよいですか?

ユーザーが特定のジョブを実行できるようにする小さなダッシュボードを作成しています。私はDjango=を使用しているので、リンクをクリックしてジョブを開始し、ジョブが実行中であることを示すメッセージとともにページを彼に返すことができるようにしたいと思います。ジョブの結果後で彼にメールで送信されます。

subprocess.Popenを使用することになっていると思いますが、よくわかりません。だから擬似コードで、ここに私がやりたいことがあります:

if job == 1:
    run script in background: /path/to/script.py
    return 'Job is running'
40
sheats
p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.STDOUT)

これにより、サブプロセスがバックグラウンドで開始されます。スクリプトは正常に実行され続けます。

ドキュメントを読む here

62
nosklo

メッセージキューを介してこれを実行することは、長期的なスケーリングについて考えている場合に間違いなく進むべき方法です。バックグラウンドで常に実行されているキューにメッセージを送信し、さまざまな種類のメッセージを処理するジョブハンドラーを記述します。

Djangoを使用しているので、 Beanstalkd はかなり適していると思います。 これは この件に関するかなり素晴らしいチュートリアルです。その記事の最初のコメントにもいくつかの良いヒントがあります。

個人的には、Erlangで記述されたカスタムインメモリキューサーバーと、Cで記述されたPythonバインディングを使用しています。ただし、 redis は、将来のキューイング/メッセージングのニーズ。お役に立てれば!

6
user89069

subprocess.Popenはまさにあなたが探しているものです。

3
Aaron Maenpaa

サブプロセスと親の間で大量の情報の通信を開始したい場合は、スレッド、またはTwistedのようなRPCフレームワークを検討することをお勧めします。

しかし、おそらくそれらはあなたのアプリケーションにとって重すぎる。

1
Sean Cavanagh