【问题标题】:Control the amount of jobs in multiprocessing async python控制多处理异步python中的作业数量
【发布时间】:2016-02-10 23:01:16
【问题描述】:

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

【问题讨论】:

    标签: python python-2.7 asynchronous multiprocessing


    【解决方案1】:

    您的循环不起作用,因为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

    【讨论】:

    • 谢谢 Bj0,这为我清除了很多。我真的对发球有误解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多