【发布时间】:2012-06-28 09:03:59
【问题描述】:
我的 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:~$
【问题讨论】:
-
处理此问题的一种典型方法是使用工作队列。根据请求填充队列并使用可能由 cron 或其他调度程序启动的单独进程来使用队列。
-
我已经更新了我的帖子。如果你运行它,它将一直挂起,直到脚本完成。可以看到返回值,但是怕挂了。