4

我在我的 Django 站点中迫切需要这个,但由于时间限制,我无法进行任何重大修改。这可能是最便宜的就地修改。

如果我们只关注其中一个buildrun...

  1. build现在我从(或运行)取回 id 。

  2. 所有繁重的工作现在都在一个单独的函数中。

'

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在不中断的情况下放置在背景上吗?

谢谢。

我读过这篇如何在 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 是一个很好的解决方案。它将让您排队处理并将您的 vie 权利返回给用户。然后,您的流程将按照排队的顺序执行

我相信从 Django 打开的进程与它们打开的线程相关联,因此您的视图将等待返回,直到您的进程完成

于 2012-06-27T00:21:00.190 回答