python中的spawn和detach进程

时间:2015-06-24 00:18:11

标签: python-3.x subprocess popen spawn

我在python3.4中编写一个守护进程,管理2-3个其他外部进程。我试图通过区分他们所做的工作来避免GIL。这些其他过程本质上是暂时的。所以我需要的是:

从python解释器中启动一个进程,并立即将其与启动它的进程分离。我希望它们完全隔离,而不共享stdout,stderr,stdin或其他资源。我不想等待进程退出,返回代码,stdout,stderr或通过stdin提供数据。

根据文档,它现在建议进行子处理。这就是我现在使用的:

subprocess.Popen(["python3.4", daemonfile], env=env)

它有效,但是:

  • 当进程启动时,stdout和stderr将打印在主守护程序启动的同一控制台上。我希望他们完全脱离。
  • 使用' shell = True',python解释器进入解释器模式'代替。
  • subprocess.Popen建议使用os.spawn *** calls

开始一个完整的独立流程的最佳方式是什么?(从技术上讲,甚至不是孩子?)并将其完全与父母分离,这样他们就不会共享资源?

1 个答案:

答案 0 :(得分:0)

首先,没有一个完全脱离的过程'从任何进程,甚至是OS内核,除了第一个进程。您可以发现所有其他进程总是有一个根进程。

因此,即使是孩子,也无法开始一个完整的独立过程。

您可以做的是使用multiprocessing模块来避免GIL限制,它是一个独立的进程,通过管道与主进程通信,因此它们不共享相同的内存空间。 / p>

关于其他问题:

  1. 您可以将stdout和stderr更改为您喜欢的任何内容,只要它是有效的描述符即可。

  2. 你可以关闭shell = True ...只是为了确保你知道什么是shell = True

  3. 子进程只是执行某些事情并获取其输出或错误的一种手段。做什么建议。如果您不关心输出或退出代码,只需忽略它,并使用subprocess.PIPE替换stdout / stderr,然后它就不会在控制台上打印任何内容。

  4. 我不确定为什么使用独立进程对您来说如此重要,除非GIL限制了您的性能。使用线程而不是进程也可以提高性能,因为切换进程上下文比线程上下文昂贵得多。如果它只是一些IO操作或简单任务,使用线程更方便。