我正在尝试创建一个脚本,一次只使用4个进程,并在返回值后再启动另一个进程。我认为有些问题是results.get
一直等到它得到结果,并且在返回值之前不会继续。我希望While循环在我等待结果时继续。
https://docs.python.org/2.7/library/multiprocessing.html#multiprocessing.pool.AsyncResult.get
import multiprocessing as mp
import time
from random import randint
def print_hello(VPN_Name):
time.sleep(randint(0,5))
return VPN_Name
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_len = len(VPN_list)
x = 0
pool = mp.Pool(processes=4)
job_tracker = []
complete_tracker = []
while True:
for VPN_Name in VPN_list:
if VPN_len == 0:
break
while True:
print "Complete Job Tracker ", complete_tracker
print "Job Tracker ", job_tracker
for comp in complete_tracker:
if comp in job_tracker:
x = x - 1
job_tracker.remove(comp)
print "Confirmed complete " + comp
continue
if x < 4:
results = pool.apply_async(print_hello,args=(VPN_Name,))
VPN_len = VPN_len - 1
x = x + 1
print "Started " + VPN_Name
job_tracker.append(VPN_Name)
complete_tracker.append(results.get())
break
continue
答案 0 :(得分:1)
你的循环不起作用,因为results.get
会阻塞,直到结果可用,这有效地使你的代码不平行。您似乎正在尝试进行大量额外工作以获得多处理功能.Pool会自动为您提供。
执行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
这将在pool.map
处阻止,直到所有任务完成,然后按照您提交的顺序一次性返回所有任务。如果您希望他们在完成后返回(但仍然按顺序),您可以使用pool.imap
,如果您不关心订单但只想在结果可用时立即使用,请使用{ {3}}