I am trying to implement multiprocessing, but I am having difficulties accessing information from the object scans that I'm passing through the pool.map() function
Before multiprocessing (this works perfectly):
for sc in scans:
my_file = scans[sc].resources['DICOM'].files[0]
After multiprocessing (does not work, error shown below):
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()
The error I am getting with 'After multiprocessing' code:
---> 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
data_inputs? First of all you don't need to declare it as global. Your code as above should work fine. Assuming it's a dict, you can just pass its values instead :pool.map(process_scan, data_inputs.values())TypeError: can't pickle module objectsXNATListingobjects... But as I said, your code should just work. There is no need to declare variables as globals for reading...data_inputsis still accessible... I don't understand what's wrong with it, are you getting an error? No output? As I said the code should just work. Unless I'm missing something because there is no minimal reproducible example