Multiprocessing报错AttributeError:无法获取__mp_main__模块的do_something属性
解决multiprocessing中的AttributeError问题
报错信息
运行代码时终端出现如下错误:
AttributeError: Can't get attribute 'do_something' on <module '__mp_main__' from 'x.py'>
原代码
import multiprocessing import time if __name__ == '__main__': start = time.perf_counter() def do_something(): print('Sleeping 1 second...') time.sleep(1) print('Done sleeping...') p1 = multiprocessing.Process(target=do_something) p2 = multiprocessing.Process(target=do_something) p1.start() p2.start() # Call join() to wait for processes to finish running p1.join() p2.join() finish = time.perf_counter() print(f'Finished in {round(finish-start, 2)} second(s)')
问题原因
在Windows系统中,multiprocessing创建子进程时会重新导入主模块。但你把do_something函数定义在了if __name__ == '__main__':代码块内部——子进程导入主模块时,这个代码块不会执行,所以子进程找不到该函数,直接抛出AttributeError。
修复方案
把do_something函数移到if __name__ == '__main__':代码块外面,让子进程能正常导入到这个函数。
修复后的代码
import multiprocessing import time def do_something(): print('Sleeping 1 second...') time.sleep(1) print('Done sleeping...') if __name__ == '__main__': start = time.perf_counter() p1 = multiprocessing.Process(target=do_something) p2 = multiprocessing.Process(target=do_something) p1.start() p2.start() # 等待进程执行完毕 p1.join() p2.join() finish = time.perf_counter() print(f'Finished in {round(finish-start, 2)} second(s)')
预期输出
Sleeping 1 second... Sleeping 1 second... Done sleeping... Done sleeping... Finished in 1 second(s)
内容的提问来源于stack exchange,提问作者aaarandomer
相关产品推荐
相关产品推荐

