Многопроцессорная обработка с использованием класса Pool в Python с ошибкой Pickling - PullRequest
2 голосов
/ 31 января 2020

Я пытаюсь запустить простой пример многопроцессорной обработки в python3 .6 в блокноте zeppelin (в windows), но я не могу его выполнить. Ниже приведен код, который я использовал:


def sqrt(x):
    return x**0.5

numbers = [i for i in range(1000000)]
with Pool() as pool:
    sqrt_ls = pool.map(sqrt, numbers)

После запуска этого кода я получаю следующую ошибку:

Traceback (most recent call last):
  File "/tmp/zeppelin_python-3196160128578820301.py", line 315, in <module>
    exec(code, _zcUserQueryNameSpace)
  File "<stdin>", line 6, in <module>
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 266, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 644, in get
    raise self._value
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks
    put(task)
  File "/usr/lib64/python3.6/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/usr/lib64/python3.6/multiprocessing/reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function sqrt at 0x7f6f84f1a620>: attribute lookup sqrt on __main__ failed

Я не уверен, что только я, кто сталкивается с проблемой , Как я видел очень много статей, где люди могут легко запустить код. Если вы знаете решение, пожалуйста, помогите

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Ноутбук Zeppelin недостаточно хорошо имитирует обычный модуль, чтобы поддерживать травление, которое используется для определения правильной работы другого процесса. Вы можете поместить все функции , которые вы хотите вызвать, в соответствующий модуль, который вы import выполняете обычным способом.

0 голосов
/ 31 января 2020

Из многопроцессорной документации :

Примечание. Для работы этого пакета требуется, чтобы модуль main импортировался детьми. Это описано в Руководстве по программированию, но на это стоит обратить внимание. Это означает, что некоторые примеры, такие как примеры пула, не будут работать в интерактивном интерпретаторе.

Записные книжки используют Python интерактивных интерпретаторов за сценой, поэтому, вероятно, вы получаете эту ошибку. Вы можете попытаться запустить свой код из оператора if __name__ == '__main__':.

...