关于问题6721,python标准库中的锁应该在fork上进行清理,在Linux的同一个python应用程序中同时使用多进程和用户线程的最佳实践或解决方法是什么?
为什么我两个都需要?我使用子进程来执行繁重的计算,这些计算产生的数据结构结果太大而无法通过队列返回--相反,它们必须立即存储到磁盘。让这些子进程中的每个子进程都由单独的线程监控似乎很有效,这样完成后,线程就可以处理将大量(例如多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
有一个相当无用的建议“小心”,并链接到上面的链接。
但冗长的讨论re: Issue6721表明,在同一应用程序中同时使用多进程(或os.fork)和用户线程是一个'bug‘。由于我对这个问题的理解有限,我在讨论中发现了太多的分歧,无法得出在同一应用程序中同时使用多处理和线程的解决方法或策略是什么。我的直接问题通过禁用日志记录得到了解决,但我在父进程和子进程中创建了少量其他(显式)锁,并怀疑我正在为进一步的间歇性死锁设置自己。
在python (2.7,3.2,3.3)应用程序中使用线程和多处理时,使用锁和/或日志记录模块时,您能给出避免死锁的实用建议吗?
发布于 2012-10-29 11:24:24
如果您在程序中仍然只有一个线程时派生额外的进程(即,在派生工作线程之前从主线程派生),那么您将是安全的。
您的用例看起来甚至不需要多处理模块;您可以使用子进程(甚至更简单的类似os.system的调用)。
https://stackoverflow.com/questions/12984003
复制相似问题