我正在用python3.4编写一个守护进程,它管理其他2-3个外部进程。我试图通过划分他们所做的工作来避免GIL。这些其他程序都是临时性的。所以我需要的是:
从python解释器中启动进程,并立即将其与启动进程的进程分离。我希望他们完全隔离,而不共享stdout、stderr、stdin或其他资源。我不想等待进程退出、返回代码、stdout、stderr或通过stdin提供数据。
根据文档,现在建议对其进行子处理。我现在用的是:
subprocess.Popen(["python3.4", daemonfile], env=env)它很有效,但:
什么是最好的方式开始一个完整的独立过程(技术上,甚至不是一个孩子?)它是否与父级完全分离,以致于它们不共享资源?
发布于 2015-06-24 01:09:15
首先,除了第一个进程之外,没有任何进程与任何进程完全“分离”,甚至操作系统内核也是如此。您可以发现,对于所有其他进程,总是有一个根进程。
因此,没有办法开始一个完整的独立过程,甚至连一个孩子都没有。
您可以做的是使用multiprocessing模块来避免GIL限制,它是一个独立的进程,通过管道与主进程通信,因此它们不能共享相同的内存空间。
关于其他问题:
subprocess.PIPE替换stdout/stderr,那么它将不会在控制台上打印任何内容。我不知道为什么使用独立的过程对您如此重要,除非GIL限制了您的性能。使用线程而不是进程也可以提高性能,因为切换进程上下文比线程上下文昂贵得多。如果只是一些IO操作或简单的任务,那么使用线程就更方便了。
https://stackoverflow.com/questions/31015591
复制相似问题