以下代码可以正常工作:
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"库时:
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
我不能使用多重处理,因为以后我必须在主应用程序上使用不可拾取的对象,所以必须使用具有莳萝序列化的多重处理。
我注意到,将“时间”导入放置在“ print_time_and_value”函数而不是全局范围内可以解决此问题,但是这种行为有点奇怪。由于它是多处理的分支,所以我猜想它会以相同的方式工作。
我正在使用Python 3.7.0,多进程模块的版本为0.70.7;在Windows 10的64位Anaconda环境上运行。
答案 0 :(得分:0)
我是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
,因为它使序列化更加容易。