混合多处理和Python中线程的状态(Status of mixing multiprocessin

2019-07-01 10:05发布

什么是最佳做法或变通在Linux中在同一个Python应用程序同时使用多和用户线程相对于发行6721,在Python标准库的锁应该叉子进行消毒?

为什么我需要两者兼而有之? 我用的子进程来做到这一点产生的数据结构的结果是太大了,通过队列返回繁重的计算 - 而他们必须立即存储到磁盘。 它似乎来的有效,分别由单独的线程监视这些孩子的过程中,使完成后,线程可以处理的读取大IO(如多GB)的数据备份到哪里,需要在进一步的计算结果的过程与其他子过程的结果相结合。 孩子们会处理间歇性死机,我刚刚(后多头上重击)发现通过使用日志模块“造成的”。 其他人在这里记录的问题:

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

它指向这个显然没有解决问题蟒:锁在Python标准库应该在叉进行消毒; http://bugs.python.org/issue6721

在我曾经跟踪下来的难度感到震惊,我回答:

是否有任何理由不Python中混合多处理和线程模块

有相当无益建议,“小心”,并链接到上面。

但长时间的讨论重:发行6721表明,它是一个“错误”同时使用多(或os.fork)和用户线程在同一应用程序。 用我有限的对问题的理解,我觉得在讨论太多分歧断定哪些变通或战略在同一应用程序同时使用多线程和。 我眼前的问题是由禁用日志记录解决,但我创造既父子进程等(明确的)锁一小撮,并怀疑我自己设置了进一步的间歇性死锁。

你能给切实可行的建议,以避免死锁在使用锁​​和/或日志模块,同时使用线程和多处理在Python(2.7,3.2,3.3)应用程序?

Answer 1:

如果你叉掉额外的流程,同时你还只有一个线程在你的程序中,您将是安全的(即从主线程叉,产卵工作线程之前)。

你的使用情况看起来像你甚至都不需要多处理模块; 你可以使用子进程(或者更简单的使用os.system般的调用)。

又见它是安全的,从一个线程中叉?



文章来源: Status of mixing multiprocessing and threading in Python