运行多进程程序时出现错误AttributeError: Can't get attribute 'long_time_task' on <module '__main__' (built-in)>
。由于某些原因Pool不能使用未在导入的模块中定义的对象。解决的方法是你必须将函数写入不同的文件模块并导入该模块。
解决办法:
一个文件产生错误,把函数定义放在另一个py文件中再引入。
one.py
from multiprocessing import Pool
from long_time_task import long_time_task
import os
if __name__=='__main__':
print('Parent process %s.' % os.getpid())
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print('Waiting for all subprocesses done...')
p.close()
p.join()
print('All subprocesses done.')
long_time_task.py
import os, time, random
def long_time_task(name):
print('Run task %s (%s)...' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (name, (end - start)))
这个问题似乎是多处理器的一个设计缺陷,具体请参阅:https://bugs.python.org/issue25053