在 python 中生成和分离进程

Spawn and detach process in python

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

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

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

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

有效,但是:

启动一个完整的独立进程(从技术上讲,甚至不是一个子进程?)并使其完全脱离父进程以便它们不共享资源的最佳方法是什么?

首先,除了第一个进程之外,没有任何进程完全'detached'来自任何进程,即使是OS内核。您会发现所有其他进程总是有一个根进程。

因此,没有办法启动一个完整的单独进程,甚至是一个子进程。

你可以做的是使用multiprocessing模块来避免GIL限制,它是一个独立的进程,通过管道与主进程通信,所以它们不共享相同的内存space.

其他问题:

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

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

  3. subprocess 只是执行某事并获取其输出或错误的一种手段。做推荐的事。如果你不关心输出或退出代码,忽略它,用subprocess.PIPE代替stdout/stderr,那么它不会在控制台打印任何东西。

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