我在Django网站上急需这个,但由于时间限制,我不能做任何重大修改。这可能是最便宜的就地修改。
如果我们只关注build
或run
...
现在我从build
(或运行)获取了ID。
现在所有繁重的工作都在另外一项功能中。
import multiprocessing as mp
def main():
id = get_build_id(....)
work = mp.Process(target=heavy_build_fn)
work.start()
return id
如果我在shell中运行它(我没有在实际的Django应用程序上测试过),终端将不会完全结束,直到work
进程完成其工作。作为一个网络应用程序,我需要立即返回ID。我可以在不中断的情况下将work
放在背景上吗?
感谢。
我已经阅读了这个How do I run another script in Python without waiting for it to finish?,但我想知道其他方法,例如,坚持使用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:~$
答案 0 :(得分: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
如果您需要在子进程继续时允许进程结束,请在此处查看答案:
答案 1 :(得分:0)
不,处理所需内容的最简单方法是使用消息代理。 Django芹菜是一个很好的解决方案。它会让您对进程进行排队并将您的权利返回给用户。然后,您的流程将按排队顺序执行
我认为从Django打开的进程与他们打开的线程相关联,因此您的视图将等待返回,直到您的进程完成