从python中产生进程

时间:2009-06-09 20:38:50

标签: python process spawn

我正在生成一个从这样的网络应用程序运行很长时间的脚本:

os.spawnle(os.P_NOWAIT, "../bin/producenotify.py", "producenotify.py", "xx",os.environ)

脚本成功生成并运行,但直到它结束我无法释放Web应用程序使用的端口,或者换句话说,我无法重新启动Web应用程序。我如何产生一个流程并使其完全独立于Web应用程序?

这是在linux操作系统上。

2 个答案:

答案 0 :(得分:26)

由于@mark澄清它是一个Linux系统,脚本可以通过遵循recipe轻松地使自己完全独立,即守护程序。 (您也可以在os.fork之后在父级中执行此操作,然后只在子级进程os.exec...之后执行此操作。

编辑:澄清@ mark对我的答案的评论的一些细节:不需要超级用户权限来根据食谱配方“守护”一个过程,也不需要更改当前的工作目录(尽管配方中的代码确实做到了这一点,这不是关键部分 - 而是fork_exitsetsid调用的正确逻辑顺序。在<{1}}中以结尾的各种os.exec...变体使用父进程的环境,因此该部分也很容易 - 请参阅Python online docs

要解决其他人的评论和答案中提出的建议:我认为esubprocess本身并没有守护儿童过程,这似乎是@mark需要的;脚本可以自己完成,但由于某些代码必须执行multiprocessingfork,所以我觉得把所有的产卵保持在低水平 - 平面而不是在操作过程中混合一些高级代码和一些低级代码。

这是上述URL中的配方的大大简化和简化版本,专为在父级中调用以生成守护程序子项而定制 - 这样,代码也可用于执行非Python可执行文件。如上所述,代码应满足@mark解释的需求,当然它可以通过多种方式进行定制 - 我强烈建议您阅读原始配方及其评论和讨论,以及它推荐的书籍,以获取更多信息。 / p>

setsid

答案 1 :(得分:12)

您可以使用多处理库来生成进程。这里显示了一个基本示例:

from multiprocessing import Process

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()