控制多处理async python

时间:2016-02-10 23:01:17

标签: python python-2.7 asynchronous multiprocessing

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

1 个答案:

答案 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}}