当我有输入问题时,问题解决了我的多处理段不起作用。
我已经尝试了许多解决方法,但找不到解决方案,除了消除输入,但是我需要它来允许其他人与我的工具进行交互。
import time
from multiprocessing import Pool
import collections
choice = input("Do you wish to start program? n")
print("hello")
start_time = time.time()
value = collections.namedtuple('value',['vectx','vecty'])
Values = (value(vectx=0,vecty=5),value(vectx=5,vecty=10),value(vectx=10,vecty=15),value(vectx=15,vecty=20))#,value(vectx=200,vecty=300),value(vectx=300,vecty=400),value(vectx=400,vecty=500),value(vectx=500,vecty=600),value(vectx=600,vecty=700),value(vectx=700,vecty=800),value(vectx=800,vecty=900),value(vectx=900,vecty=1000),value(vectx=1000,vecty=1100),value(vectx=1100,vecty=1200))
print("Start")
def Alter(x):
vectx=x.vectx
vecty=x.vecty
Z=(vectx+vecty)
return(Z)
if choice == "Yes":
print(1)
if __name__ == '__main__':
with Pool(10) as p:
result=p.map(Alter, Values)
new = []
print("end")
print("result Done")
for i in result:
new.append(i)
print( "My program took " +str(time.time() - start_time)+ " to run")
预期结果是程序完成。
你的问题是Windows没有像基于Unix的机器那样fork
。因此,在 Windows 上运行的池的每个进程都会在创建时导入主文件。
因此,程序中发生的情况是,每个新进程都要求输入,而程序会与自身纠缠在一起。我有点不清楚if __name__ == '__main__':
的位置,但这里的重点是你需要保留所有需要运行的东西。只把所有进程之间共享的重要内容放在它之外。例如,窗口上的工作代码可以是:
import time
from multiprocessing import Pool
import collections
def Alter(x):
vectx = x.vectx
vecty = x.vecty
Z = (vectx + vecty)
return Z
value = collections.namedtuple('value', ['vectx', 'vecty'])
if __name__ == '__main__':
choice = input("Do you wish to start program? n")
Values = (value(vectx=0,vecty=5),value(vectx=5,vecty=10),value(vectx=10,vecty=15))
if choice == "Yes":
print("Start")
start_time = time.time()
with Pool(10) as p:
result = p.map(Alter, Values)
print("My program took " + str(time.time() - start_time) + " to run")
给:
Do you wish to start program?
Yes
Start
My program took 1.9328622817993164 to run
从文档中,在编程指南下,安全导入主模块部分:
确保主模块可以由新的 Python 安全地导入解释器不会引起意外的副作用(例如启动 新流程(。