Python 如何在函数中使用多处理?
我想在“a.py”中定义一个使用多处理进行并行化的函数,然后将其作为库函数导入“b.py”。例如,在“a.py”中: 然后在“b.py”中: 但是,它不会工作,我总是会得到错误:\ u pickle.PicklingError:无法pickle:线程上的属性查找锁定失败。 那么,有没有可能以这种方式使用python的多处理,或者我遗漏了什么 整个回溯,稍加编辑(Python3.x,Windows):Python 如何在函数中使用多处理?,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我想在“a.py”中定义一个使用多处理进行并行化的函数,然后将其作为库函数导入“b.py”。例如,在“a.py”中: 然后在“b.py”中: 但是,它不会工作,我总是会得到错误:\ u pickle.PicklingError:无法pickle:线程上的属性查找锁定失败。 那么,有没有可能以这种方式使用python的多处理,或者我遗漏了什么 整个回溯,稍加编辑(Python3.x,Windows): 回溯(最近一次呼叫最后一次): 文件“F:/b.py”,第72行,在 a、 MPTest(5)
回溯(最近一次呼叫最后一次):
文件“F:/b.py”,第72行,在
a、 MPTest(5)
MPTest中第566行的文件“F:\a.py”
p、 开始()
文件“C:\Python34\lib\multiprocessing\process.py”,第105行,在开始处
self.\u popen=self.\u popen(self)
文件“C:\Python34\lib\multiprocessing\context.py”,第212行,在\u Popen中
返回_default_context.get_context().Process._Popen(Process_obj)
文件“C:\Python34\lib\multiprocessing\context.py”,第313行,在\u Popen中
返回Popen(过程对象)
文件“C:\Python34\lib\multiprocessing\popen\u spawn\u win32.py”,第66行,在\uuuu init中__
减少.转储(进程对象,到子进程)
文件“C:\Python34\lib\multiprocessing\reduce.py”,第59行,在转储中
ForkingPickler(文件、协议).dump(obj)
_pickle.PicklingError:无法pickle:线程上的属性查找锁定失败
问题在于您使用的是,它只在同一进程中的线程之间工作,而不是在进程之间工作
根据您的平台和使用方式,这将以不同的方式失败。在您的情况下,由于您试图将队列作为参数传递给进程
构造函数,并且您在Windows上,因此您会遇到一个最好的错误:您试图对队列本身进行pickle,但失败。*在Unix上,您可能会成功地将队列传递给子进程,但它可能会丢失大部分值(OS X)或者在使用时死锁(大多数其他系统)
如前所述,multiprocessing.Queue
“几乎是Queue.Queue
”的克隆,只是它是“线程和进程安全的”,而不仅仅是线程安全的
如果您认为您使用的是
多处理.Queue
,那么您的错误在这一行:
import multiprocessing as mp, queue
这不会将多处理
作为mp
和队列
导入,而是将多处理
作为mp
导入,将队列
作为自身导入。有关详细信息,请参阅上的参考
这对人来说是不明确的(即使对解析器来说不是不明确的),这是Python中不鼓励使用多导入语句的原因之一。例如,他说“进口通常应该在单独的行上”
*如果队列本身在您对其进行pickle时引发了异常,而不是依赖于它使用了一些不可pickle的线程同步对象,这可能会更好,因为并不完全清楚pickle a
\u thread.lock
是由pickle a队列引起的。queue
请显示整个回溯,不仅仅是一个总结。很难猜出哪一行失败了。@abarnet:queue.queue vs multiprocessing.queue,这确实是我不知道的事情。
import a
a.MPTest(10)
Traceback (most recent call last):
File "F:/b.py", line 72, in <module>
a.MPTest(5)
File "F:\a.py", line 566, in MPTest
p.start()
File "C:\Python34\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "C:\Python34\lib\multiprocessing\context.py", line 212, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Python34\lib\multiprocessing\context.py", line 313, in _Popen
return Popen(process_obj)
File "C:\Python34\lib\multiprocessing\popen_spawn_win32.py", line 66, in __init__
reduction.dump(process_obj, to_child)
File "C:\Python34\lib\multiprocessing\reduction.py", line 59, in dump
ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <class '_thread.lock'>: attribute lookup lock on _thread failed
import multiprocessing as mp, queue