У меня есть скрипт Python, который работает нормально, когда я запускаю его нормально:
$ python script.py <options>
Я пытаюсь профилировать код с помощью модуля cProfile:
$ python -m cProfile -o script.prof script.py <options>
Когда я запускаю вышеупомянутую команду, я получаю сообщение об ошибке, связанную с невозможностью выбора функции:
Traceback (most recent call last):
File "scripts/process_grid.py", line 1500, in <module>
_compute_write_index(kwrgs)
File "scripts/process_grid.py", line 626, in _compute_write_index
args,
File "scripts/process_grid.py", line 1034, in _parallel_process
pool.map(_apply_along_axis_palmers, chunk_params)
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/pool.py", line 266, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/pool.py", line 644, in get
raise self._value
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks
put(task)
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/connection.py", line 206, in send
self._send_bytes(_ForkingPickler.dumps(obj))
File "/home/james/miniconda3/envs/climate/lib/python3.6/multiprocessing/reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function _apply_along_axis_palmers at 0x7fe05a540b70>: attribute lookup _apply_along_axis_palmers on __main__ failed
В коде используется многопроцессорная обработка, и я предполагаю, что именно здесь происходит травление
Код в игре здесь, на GitHub .
По сути, я отображаю функцию и соответствующий словарь аргументов в пуле процессов:
pool.map(_apply_along_axis_palmers, chunk_params)
Функция _apply_along_axis_palmers
, насколько я знаю, «поддается отбору» в том смысле, что она определена на верхнем уровне модуля.Опять же, эта ошибка не возникает при запуске вне контекста cProfile, так что, может быть, это добавляет дополнительные ограничения для травления?
Может кто-нибудь прокомментировать, почему это может происходить, и / или как я могу исправить проблему