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

时间:2012-10-20 00:03:22

标签: python multithreading logging 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

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

Are there any reasons not to mix Multiprocessing and Threading module in Python

有一个相当无益的建议,'小心'并链接到上面。

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

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

1 个答案:

答案 0 :(得分:5)

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

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

另见Is it safe to fork from within a thread?