Многопроцессная библиотека Python: NameError при использовании импортированных пакетов - PullRequest
0 голосов
/ 29 апреля 2019

Отлично работает следующий код:

from multiprocessing import Pool
import time

values = list(range(10))

def print_time_and_value(value):
    print(time.time(), value)

if __name__ == '__main__':

    p = Pool(4)
    p.map(print_time_and_value, values)

но когда я изменяю импорт "multiprocessing" на "multiprocess" library:

from multiprocess import Pool

во время выполнения возникает следующая ошибка:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    p.map(print_time_and_value, values)
  File "C:\Users\User\Anaconda3_64bits\lib\site-packages\multiprocess\pool.py", line 268, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "C:\Users\User\Anaconda3_64bits\lib\site-packages\multiprocess\pool.py", line 657, in get
    raise self._value
NameError: name 'time' is not defined

Я не могу использовать многопроцессорность, так как позже мне придется использовать непробиваемые объекты в моем основном приложении, поэтому я должен использовать многопроцессорность с сериализацией укропов.

Я заметил, что помещение импорта "time" в функцию "print_time_and_value" вместо глобальной области видимости решает эту проблему, но это поведение немного странно. Так как это форк многопроцессорной обработки, я предположил, что он будет работать так же.

Я использую Python 3.7.0, многопроцессорный модуль версии 0.70.7; работает в 64-битной среде Anaconda, Windows 10.

1 Ответ

0 голосов
/ 01 мая 2019

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

import multiprocess as mp
import time

values = list(range(10))

def print_time_and_value(value):
    print(time.time(), value)


if __name__ == '__main__':

    mp.freeze_support()  # needed for Windows
    p = mp.Pool(4)
    p.map(print_time_and_value, values)

С multiprocess ваш код должен даже работать в интерпретаторе:

Python 3.7.3 (default, Mar 30 2019, 05:40:15) 
[Clang 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import multiprocess as mp
>>> import time
>>> values = list(range(10))
>>> def print_time_and_value(value):
...     print(time.time(), value)
... 
>>> p = mp.Pool(4)
>>> _ = p.map(print_time_and_value, values)
1556681189.844021 0
1556681189.8443708 1
1556681189.8446798 2
1556681189.845576 4
1556681189.84569 5
1556681189.8458931 3
1556681189.846055 6
1556681189.846396 7
1556681189.846845 8
1556681189.847295 9
>>> 

Обратите внимание, что обычно включает , включая import time внутри функции, поскольку это облегчает сериализацию.

...