LIS*_*INE 7 python multiprocessing
我有几个回调函数,我想启动多个进程,并通过父进程的信号终止它们.
我目前的做法是创建一个共享c_bool multiprocessing.Value并将其设置为True,然后在创建它时将其分发给我的所有进程.我的进程都使用共享bool运行while循环,如下所示:
while myC_bool: ...keep running...
Run Code Online (Sandbox Code Playgroud)
然后我可以将bool切换到False我的父进程,所有子进程将完成最后一个循环并退出.
许多人都告诉我,并且已经在文档中读到,在使用多处理时应该尝试避免使用共享内存.我被告知避免这种情况的最佳方法是守护进程,给它一个自定义信号处理程序并发送一个sigint/sigterm/etc ......
我的问题是,是专门使用bool来保持循环活动,并且只是从我的父进程改变它的值,并从多个子进程读取一个合适的解决方案,以使我的所有子进程快速安全地终止?我觉得所有孩子只需要查看一个共享bool就可以减少开销,而不是向他们发送x个sigints.
守护是否会成为更好的解决方案?如果是这样,我想帮助理解为什么.
您的解决方案有很多很好的理由:
… 等等.
请记住,除非你能够证明自己multiprocessing以及基础操作系统原语,在你关心的每个平台上都保证在没有同步的情况下工作,你需要Lock在每次访问共享bool时放置一个或其他东西.这并不是很复杂,但是......一旦你完成了这一点,使用例如Event没有共享的bool可能会更简单.
无论如何,如果有任何这些是你的理由,我会说很好,就这样做.但根据你的问题,你实际上是因为性能而选择了这个:
我觉得所有孩子只需要查看一个共享bool的开销就少了,而不是向他们发送x个sigints
如果这是你的理由,你几乎肯定是错的.孩子们每次通过一些循环都必须查看共享bool(并获取共享锁!),而信号只需要发送给每个孩子一次.所以,你的开销几乎肯定会高得多.
但实际上,我无法想象每个子进程发送一个信号的开销,甚至每个进程每个循环抓取一次进程间锁定的开销,在任何有用的程序中都是接近瓶颈的,所以...为什么这里的开销很重要首先?以最简单的方式做最有意义的事情.
| 归档时间: |
|
| 查看次数: |
4772 次 |
| 最近记录: |