在 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)
有效,但是:
- 进程启动时,stdout 和 stderr 将打印在启动主守护程序的同一控制台上。我希望它们完全分离。
- 与 'shell=True' 相比,python 解释器改为输入 'interpreter mode'。
- subprocess.Popen 被推荐以支持 os.spawn*** 来电
启动一个完整的独立进程(从技术上讲,甚至不是一个子进程?)并使其完全脱离父进程以便它们不共享资源的最佳方法是什么?
首先,除了第一个进程之外,没有任何进程完全'detached'来自任何进程,即使是OS内核。您会发现所有其他进程总是有一个根进程。
因此,没有办法启动一个完整的单独进程,甚至是一个子进程。
你可以做的是使用multiprocessing
模块来避免GIL限制,它是一个独立的进程,通过管道与主进程通信,所以它们不共享相同的内存space.
其他问题:
您可以将 stdout 和 stderr 更改为您喜欢的任何内容,只要它是有效的描述符即可。
您可以关闭 shell=True...只是为了确保您知道什么是 shell=True
subprocess 只是执行某事并获取其输出或错误的一种手段。做推荐的事。如果你不关心输出或退出代码,忽略它,用subprocess.PIPE
代替stdout/stderr,那么它不会在控制台打印任何东西。
我不确定为什么使用独立进程对您如此重要,除非 GIL 限制了您的性能。使用线程而不是进程也可以提高性能,因为切换进程上下文比线程上下文昂贵得多。如果只是一些IO操作或者简单的任务,使用线程更方便。
我正在 python3.4 中编写一个守护进程来管理 2-3 个其他外部进程。我试图通过划分他们所做的工作来避免 GIL。这些其他过程本质上是暂时的。那么我需要的是:
从 python 解释器中启动一个进程,并立即将其与启动它的解释器分离。我希望它们在不共享 stdout、stderr、stdin 或其他资源的情况下完全隔离。我不想等待进程退出、return 代码、stdout、stderr 或通过 stdin 提供数据。
根据文档,现在建议进行子处理。这是我现在使用的:
subprocess.Popen(["python3.4", daemonfile], env=env)
有效,但是:
- 进程启动时,stdout 和 stderr 将打印在启动主守护程序的同一控制台上。我希望它们完全分离。
- 与 'shell=True' 相比,python 解释器改为输入 'interpreter mode'。
- subprocess.Popen 被推荐以支持 os.spawn*** 来电
启动一个完整的独立进程(从技术上讲,甚至不是一个子进程?)并使其完全脱离父进程以便它们不共享资源的最佳方法是什么?
首先,除了第一个进程之外,没有任何进程完全'detached'来自任何进程,即使是OS内核。您会发现所有其他进程总是有一个根进程。
因此,没有办法启动一个完整的单独进程,甚至是一个子进程。
你可以做的是使用multiprocessing
模块来避免GIL限制,它是一个独立的进程,通过管道与主进程通信,所以它们不共享相同的内存space.
其他问题:
您可以将 stdout 和 stderr 更改为您喜欢的任何内容,只要它是有效的描述符即可。
您可以关闭 shell=True...只是为了确保您知道什么是 shell=True
subprocess 只是执行某事并获取其输出或错误的一种手段。做推荐的事。如果你不关心输出或退出代码,忽略它,用
subprocess.PIPE
代替stdout/stderr,那么它不会在控制台打印任何东西。
我不确定为什么使用独立进程对您如此重要,除非 GIL 限制了您的性能。使用线程而不是进程也可以提高性能,因为切换进程上下文比线程上下文昂贵得多。如果只是一些IO操作或者简单的任务,使用线程更方便。