控制多处理异步python中的作业量

控制多处理异步python中的作业量,python,python-2.7,asynchronous,multiprocessing,Python,Python 2.7,Asynchronous,Multiprocessing,我正在尝试创建一个脚本,该脚本一次只使用4个进程,并在返回值后启动另一个进程。我认为部分问题在于结果。获取 一直等待,直到得到结果,并且在返回值之前不会继续。我希望While循环在等待结果时继续 将多处理导入为mp 导入时间 从随机导入randint def print_hello(VPN_名称): 睡眠时间(randint(0,5)) 返回虚拟专用网名称 VPN_list=['3048-VPN01','3049-VPN01','3051-VPN01','3053-VPN01','3058-V

我正在尝试创建一个脚本,该脚本一次只使用4个进程,并在返回值后启动另一个进程。我认为部分问题在于
结果。获取

一直等待,直到得到结果,并且在返回值之前不会继续。我希望While循环在等待结果时继续

将多处理导入为mp
导入时间
从随机导入randint
def print_hello(VPN_名称):
睡眠时间(randint(0,5))
返回虚拟专用网名称
VPN_list=['3048-VPN01','3049-VPN01','3051-VPN01','3053-VPN01','3058-VPN01','3059-VPN01','3061-MULTI01','3063-VPN01','3065-VPN01','3066-MULTI01','3067-VPN01','3069-VPN01','3071-VPN01','3072-VPN01']
VPN\u len=len(VPN\u列表)
x=0
pool=mp.pool(进程=4)
作业跟踪器=[]
完整的跟踪程序=[]
尽管如此:
对于VPN_列表中的VPN_名称:
如果VPN_len==0:
打破
尽管如此:
打印“完整的工作跟踪器”,完整的工作跟踪器
打印“作业跟踪器”,作业跟踪器
对于comp in complete_tracker:
如果作业跟踪器中的公司:
x=x-1
作业跟踪器。移除(组件)
打印“已确认完成”+补偿
持续
如果x<4:
结果=pool.apply\u async(print\u hello,args=(VPN\u Name,))
VPN\u len=VPN\u len-1
x=x+1
打印“已启动”+VPN\u名称
job_tracker.append(VPN_名称)
完成\u tracker.append(results.get())
打破
持续

您的循环无法工作,因为
会产生结果。获取
块直到结果可用,这将有效地使您的代码不并行。您似乎试图做很多额外的工作来获得多处理池自动为您提供的功能

当您执行pm.Pool(4)
时,您将创建一个包含4个进程的池,因此当您将许多任务传递给池时,它将一次执行4个,直到它们全部完成。甚至还有一些函数可以将输入集合提交到池中,这样您就不必自己迭代

这使您可以将整个
while
循环替换为:

pool = mp.Pool(processes=4)

results = pool.map(print_hello, VPN_list)

for result in results:
    print "Confirmed complete " + result

这将在处阻止,直到所有任务完成,然后按提交顺序立即返回所有任务。如果您希望它们在完成时返回(但仍按顺序),您可以使用。如果您不关心顺序,只想在结果可用时立即返回,请使用

谢谢Bj0,这对我来说已经很清楚了。我对那件事真的有点误解。
pool = mp.Pool(processes=4)

results = pool.map(print_hello, VPN_list)

for result in results:
    print "Confirmed complete " + result