4

これはDjangoサイトで緊急に必要ですが、時間の制約があるため、大幅な変更を行うことはできません。これはおそらく最も安価なインプレース変更です。

buildどちらかに焦点を当てるとrun...

  1. 今、私はIDを元に戻しますbuild(または実行します)。

  2. 重い作業はすべて別の機能になりました。

'

import multiprocessing as mp
def main():
   id = get_build_id(....)
   work = mp.Process(target=heavy_build_fn)
   work.start()
   return id

これをシェルで実行した場合(実際のDjangoアプリでこれをテストしていません)、workプロセスがそのジョブで完了するまで、ターミナルは完全に終了しません。Webアプリとして、すぐにIDを返す必要があります。work中断せずに背景に配置できますか?

ありがとう。

これを読みましたPythonで別のスクリプトを、終了するのを待たずに実行するにはどうすればよいですか?、しかし私はそれを行う他の方法を知りたいです、例えば、MPに固執する。解決策はPopen私が実際に望んでいるものではないかもしれません。


import multiprocessing as mp
import time

def build():
    print 'I build things'
    with open('first.txt', 'w+') as f:
        f.write('')

    time.sleep(10)
    with open('myname.txt', 'w+') as f:
        f.write('3')
    return

def main():
    build_p = mp.Process(name='build process', target=build)
    build_p.start()
    build_p.join(2)
    return 18

if __name__ == '__main__':

    v = main()
    print v
    print 'done'

コンソール:

I build things
18
done
|

待って

ついに

user@user-P5E-VM-DO:~$ python mp3.py
I build things
18
done
user@user-P5E-VM-DO:~$ 
4

2 に答える 2

3

を削除するjoin()と、必要なものが得られる場合があります。 join()プロセスが終了するのを待ってから戻ります。

子プロセスが終了する前に値が返されますが、子プロセスが完了するまで親プロセスは存続します。それがあなたにとって問題であるかどうかわからない。

このコード:

import multiprocessing as mp
import time

def build():
    print 'I build things'
    for i in range(10):
        with open('testfile{}.txt'.format(i), 'w+') as f:
            f.write('')
            time.sleep(5)


def main():
    build_p = mp.Process(name='build process', target=build)
    build_p.start()
    return 18

if __name__ == '__main__':

    v = main()
    print v
    print 'done'

戻り値:

> python mptest.py
18
done
I build things

子プロセスが続行している間にプロセスを終了できるようにする必要がある場合は、ここで回答を確認してください。

プロセスを実行し、待たないでください

于 2012-06-27T02:51:45.853 に答える
0

いいえ、必要なものを処理する最も簡単な方法は、おそらくメッセージ ブローカーを使用することです。Django celery は優れたソリューションです。プロセスをキューに入れ、権利をユーザーに返すことができます。その後、プロセスはキューに入れられた順序で実行されます

Django から開かれたプロセスは、それらが開かれたスレッドに関連付けられているため、ビューはプロセスが完了するまで待機します。

于 2012-06-27T00:21:00.190 に答える