首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python中的产卵和分离过程

python中的产卵和分离过程
EN

Stack Overflow用户
提问于 2015-06-24 00:18:11
回答 1查看 5.4K关注 0票数 2

我正在用python3.4编写一个守护进程,它管理其他2-3个外部进程。我试图通过划分他们所做的工作来避免GIL。这些其他程序都是临时性的。所以我需要的是:

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

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

代码语言:javascript
运行
复制
subprocess.Popen(["python3.4", daemonfile], env=env)

它很有效,但:

  • 当进程启动时,stdout和stderr打印在启动主守护进程的同一个控制台上。我想让他们完全脱离。
  • 使用“shell=True”,python解释器将进入“解释器模式”。
  • subprocess.Popen被推荐为os.spawn***调用。

什么是最好的方式开始一个完整的独立过程(技术上,甚至不是一个孩子?)它是否与父级完全分离,以致于它们不共享资源?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-24 01:09:15

首先,除了第一个进程之外,没有任何进程与任何进程完全“分离”,甚至操作系统内核也是如此。您可以发现,对于所有其他进程,总是有一个根进程。

因此,没有办法开始一个完整的独立过程,甚至连一个孩子都没有。

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

关于其他问题:

  1. 只要它是一个有效的描述符,就可以将stdout和stderr更改为您喜欢的任何东西。
  2. 你可以关掉shell=True..。只是为了确保你知道什么是shell=True
  3. 子进程只是执行某件事情并获得其输出或错误的一种手段。做建议的事。如果您不关心输出或退出代码,只需忽略它,并使用subprocess.PIPE替换stdout/stderr,那么它将不会在控制台上打印任何内容。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31015591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档