[英]how to fix 'TypeError: can't pickle module objects' during multiprocessing?
我正在尝试实现多处理,但我无法从我正在通过 pool.map() function 的 object扫描中访问信息
在多处理之前(这很好用):
for sc in scans:
my_file = scans[sc].resources['DICOM'].files[0]
多处理后(不起作用,错误如下所示):
def process(x):
my_file = x.resources['DICOM'].files[0]
def another_method():
...
pool = Pool(os.cpu_count())
pool.map(process, [scans[sc] for sc in scans])
another_method()
我在“多处理后”代码中遇到的错误:
---> 24 pool.map(process, [scans[sc] for sc in scans])
~/opt/anaconda3/lib/python3.7/multiprocessing/pool.py in map(self, func, iterable, chunksize)
266 in a list that is returned.
267 '''
--> 268 return self._map_async(func, iterable, mapstar, chunksize).get()
269
270 def starmap(self, func, iterable, chunksize=None):
~/opt/anaconda3/lib/python3.7/multiprocessing/pool.py in get(self, timeout)
655 return self._value
656 else:
--> 657 raise self._value
658
659 def _set(self, i, obj):
~/opt/anaconda3/lib/python3.7/multiprocessing/pool.py in _handle_tasks(taskqueue, put, outqueue, pool, cache)
429 break
430 try:
--> 431 put(task)
432 except Exception as e:
433 job, idx = task[:2]
~/opt/anaconda3/lib/python3.7/multiprocessing/connection.py in send(self, obj)
204 self._check_closed()
205 self._check_writable()
--> 206 self._send_bytes(_ForkingPickler.dumps(obj))
207
208 def recv_bytes(self, maxlength=None):
~/opt/anaconda3/lib/python3.7/multiprocessing/reduction.py in dumps(cls, obj, protocol)
49 def dumps(cls, obj, protocol=None):
50 buf = io.BytesIO()
---> 51 cls(buf, protocol).dump(obj)
52 return buf.getbuffer()
53
TypeError: can't pickle module objects
您没有提供完整的数据结构,但这可能会有所帮助。 多处理对对象有点敏感……一些 object 不能像文件对象一样被腌制。 Python:无法腌制模块对象错误
如果您只需要文件名,请在 map function 中使用该文件名,而不是 process
不是专家,但我通过稍微改变 for 循环解决了这个问题。
def process(i_x):
x = scans[i_x]
my_file = x.resources['DICOM'].files[0]
def another_method():
...
scans = ...
pool = Pool(os.cpu_count())
pool.map(process, [i for i in range(len(scans))])
another_method()
通过这样做,object scans
不会在 function process
的本地命名空间中找到,但会在全局命名空间中找到。 参数解析仅使用整数并避免需要将 Pickle 传输到每个进程的复杂对象。 至少我是这样理解这个问题的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.