我尝试使用多线程,为了让它保持简单,我运行以下代码:
import multiprocessing as mp
pool = mp.Pool(4)
def square(x):
return x**2
results=pool.map(square,range(1,20))
据我所知,结果应该是一个包含从1到20的正方形的列表。 但是,代码似乎没有终止。(在没有池完成的情况下执行相同的操作,在我手动停止之前,这会运行几分钟。)
附加信息:任务管理器告诉我,额外的python进程已经启动并且正在运行,但是使用了我的cpu的0%;还有其他不相关的进程,比如firefox在他们的cpu使用中飙升,而程序正在运行。 我使用的是Windows 8和i5-4300U cpu(汇集到2而不是4也不帮助)
我做错了什么? Pool类是否有任何好的资源,这可以帮助我理解我的代码有什么问题?
答案 0 :(得分:1)
池初始化的代码应该在__name__ == "__main__"
内,因为multiprocessing
每次都会导入模块以生成新进程。
import multiprocessing as mp
def square(x):
return x**2
if __name__ == '__main__':
pool = mp.Pool(4)
results=pool.map(square,range(1,20))
答案 1 :(得分:0)
您的代码会导致每个进程遇到属性错误,因为它无法找到square
属性,因为在您实例化池时未定义该属性。因此,这些过程随之而来。在池之前定义平方将解决问题。
另见:
yet another confusion with multiprocessing error, 'module' object has no attribute 'f'