繁体   English   中英

如何在多处理期间修复“TypeError:无法腌制模块对象”?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM