Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在函数中使用多处理?_Python_Python 3.x_Multiprocessing - Fatal编程技术网

Python 如何在函数中使用多处理?

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)

我想在“a.py”中定义一个使用多处理进行并行化的函数,然后将其作为库函数导入“b.py”。例如,在“a.py”中:

然后在“b.py”中:

但是,它不会工作,我总是会得到错误:\ u pickle.PicklingError:无法pickle:线程上的属性查找锁定失败。 那么,有没有可能以这种方式使用python的多处理,或者我遗漏了什么

整个回溯,稍加编辑(Python3.x,Windows):

回溯(最近一次呼叫最后一次):
文件“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