如何在后台放置一个进程,以免它中断我的返回?

时间:2012-06-26 23:59:37

标签: python multiprocessing

我在Django网站上急需这个,但由于时间限制,我不能做任何重大修改。这可能是最便宜的就地修改。

如果我们只关注buildrun ...

  1. 现在我从build(或运行)获取了ID。

  2. 现在所有繁重的工作都在另外一项功能中。

  3. 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:~$ 
    

2 个答案:

答案 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

如果您需要在子进程继续时允许进程结束,请在此处查看答案:

Run Process and Don't Wait

答案 1 :(得分:0)

不,处理所需内容的最简单方法是使用消息代理。 Django芹菜是一个很好的解决方案。它会让您对进程进行排队并将您的权利返回给用户。然后,您的流程将按排队顺序执行

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