gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:10 24 4
gpt4 key购买 nike

我正在尝试制作一个脚本,该脚本一次仅使用 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

最佳答案

您的循环不起作用,因为 results.get 会阻塞,直到结果可用,这实际上使您的代码变得非并行。您似乎正在尝试做很多额外的工作来获得 multiprocessing.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 ,如果您不关心顺序,而只想在结果可用时立即获得结果,请使用 pool.imap_unordered

关于python - 控制多处理异步python中的作业量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35327703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com