Python中混合多处理和线程的现状

ric*_*pan 23 python logging multithreading multiprocessing locks

关于问题6721,在Linux中的同一个python应用程序中使用多处理和用户线程的最佳实践或解决方法是什么,python标准库中的锁应该在fork上清理?

为什么我需要两者?我使用子进程进行大量计算,产生的数据结构太大而无法通过队列返回 - 而是必须立即将它们存储到磁盘中.通过单独的线程监视这些子进程中的每一个似乎是有效的,因此在完成时,线程可以处理将大(例如多GB)数据读回到进程中的IO,其中需要结果以进一步计算.与其他子进程的结果相结合.子进程会间歇性地挂起,我只是(经过大量的冲击)发现是由于使用了日志记录模块而导致的.其他人在这里记录了这个问题:

https://twiki.cern.ch/twiki/bin/view/Main/PythonLoggingThreadingMultiprocessingIntermixedStudy

这指出了这个明显未解决的python问题:python标准库中的锁应该在fork上进行清理; http://bugs.python.org/issue6721

对我追踪到的困难感到震惊,我回答说:

是否有任何理由不在Python中混合使用Multiprocessing和Threading模块

有一个相当无益的建议'小心'并链接到上述.

但是冗长的讨论:问题6721表明在同一个应用程序中使用多处理(或os.fork)和用户线程是一个"错误".由于我对这个问题的理解有限,我在讨论中发现了太多的分歧,无法总结在同一个应用程序中使用多处理和线程的解决方法或策略.我的直接问题是通过禁用日志记录来解决的,但我在父进程和子进程中都创建了少量其他(显式)锁,并且怀疑我正在为自己的进一步间歇性死锁做好准备.

在python(2.7,3.2,3.3)应用程序中使用线程和多处理时,是否可以提供实用建议以避免在使用锁和/或日志记录模块时发生死锁?

Igo*_*nko 5

如果在程序中只有一个线程(即从主线程中派生,在生成工作线程之前)分叉其他进程,那么将是安全的.

您的用例看起来甚至不需要多处理模块; 你可以使用subprocess(甚至更简单的os.system-like调用).

另请参阅从线程内进行分叉是否安全?

  • [这个答案](http://stackoverflow.com/a/6079669/4279)与这个问题特别相关 (2认同)