gpt4 book ai didi

python - 如何在 python 中使用多处理正确终止子进程

转载 作者:太空狗 更新时间:2023-10-29 21:32:08 24 4
gpt4 key购买 nike

我有一些回调函数,我想作为多个进程启动,并通过来自父进程的信号让它们全部终止。

我目前的做法是使用 multiprocessing.Value 创建一个共享的 c_bool 并将其设置为 True,然后在创建时将其分发到我的所有进程.我的进程都使用共享 bool 值运行一个 while 循环,如下所示:

while myC_bool: ...keep running...

然后我可以将父进程的 bool 切换为 False,所有子进程将完成它们的最终循环并退出。

很多人告诉我,并且在文档中读到在使用多处理时应该尽量避免使用共享内存。我被告知避免这种情况的最好方法是守护进程,给它一个自定义信号处理程序并向它发送一个 sigint/sigterm/etc...

我的问题是,是否只使用 bool 来保持循环事件并且只改变它在我的父进程中的值,并从多个子进程中读取它是一个合适的解决方案来使我的所有子进程快速安全地终止?我觉得与向他们发送 x 个信号相比,所有 child 只查看一个共享 bool 的开销更少。

守护进程会是更好的解决方案吗?如果是这样,我需要一些帮助来理解原因。

最佳答案

采用您的解决方案有很多充分的理由:

  • 思考比信号更容易。
  • 需要处理的跨平台问题较少。
  • 您已经获得了以这种方式工作的代码。
  • 如果您想在将来添加“正常关闭”机制,它可以很容易地添加。

……等等。

请记住,除非你能向自己证明 multiprocessing 和底层操作系统原语,在你关心的每个平台上,都可以保证在没有同步的情况下工作,否则你需要放置一个 Lock 或围绕对共享 bool 的每次访问的其他内容。这并不完全复杂,但是......一旦你完成了,使用,例如,一个没有共享 bool 的 Event 可能会更简单。

无论如何,如果其中任何一个是您的原因,我会说很好,就那样做。但是根据您的问题,您实际上是因为性能而选择了这个:

I feel like there is less overhead for all the children to just look at the one shared bool, than to send x number of sigints to them

如果这是你的理由,那你几乎可以肯定是错的。 children 每次都必须通过某个循环查看共享 bool 值(并获取共享锁!),而信号只需发送给每个 child 一次。因此,您的开销几乎肯定会以这种方式增加很多。

但实际上,我无法想象每个子进程发送一个信号的开销,或者甚至每个进程每个循环获取一次进程间锁的开销,在任何有用的程序中都接近瓶颈,所以......为什么开销一开始在这里很重要吗?以最简单的方式做最有意义的事情。

关于python - 如何在 python 中使用多处理正确终止子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15752078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com