Hel*_*hne 4 python multithreading multiprocessing gil
我需要将threading应用程序转换为应用multiprocessing程序有多种原因(GIL,内存泄漏).幸运的是,线程非常孤立,只能通过Queue.Queues进行通信.这个原语也可用,multiprocessing所以一切看起来都很好.在我进入这个雷区之前,我想就即将出现的问题得到一些建议:
Queue?我需要提供一些__setstate__吗?put立即返回(比如threading Queues)吗?对第1部分的回答:
必须通过multiprocessing.Queue(Pipe或其他)的所有东西都必须是可挑选的.这包括基本类型,如tuples,lists和dicts.如果它们是顶级的并且不太复杂,也支持类(查看详细信息).lambda然而,尝试传递s将失败.
对第2部分的回答:
A put由两部分组成:它需要一个信号量来修改队列,并且它可以选择启动一个馈线线程.因此,如果没有其他Process试图put以同样的Queue在同一时间(例如,因为只有一个Process写作的话),应该是快.对我来说,事实证明它足够快,可用于所有实际目的.
第3部分的部分答案:
multiprocessing.queue.Queue缺乏task_done方法,因此不能直接用作替代品.(子类提供了该方法.)processing.queue.Queue缺少一种qsize方法,而较新的multiprocessing版本是不准确的(只要记住这一点).fork,因此需要注意在正确的进程中关闭它们.