强制多处理池遍历参数

时间:2018-10-20 09:16:52

标签: python python-3.x python-multiprocessing

我正在使用多处理池来一遍又一遍地运行多个参数的函数。我使用由另一个线程填充的作业列表和一个job_handler函数来处理每个作业。我的问题是,当列表为空时,池将终止该功能。我想保持池活动,直到列表填满。实际上,有两种方案可以解决此问题。

1。使用一个池,但在列表为空后结束:

from multiprocessing import Pool
from threading import Thread
from time import sleep


def job_handler(i):
    print("Doing job:", i)
    sleep(0.5)

def job_adder():
    i = 0
    while True:
        jobs.append(i)
        i += 1
        sleep(0.1)


if __name__ == "__main__":
    pool = Pool(4)
    jobs = []
    thr = Thread(target=job_adder)
    thr.start()
    # wait for job_adder to add to list
    sleep(1)
    pool.map_async(job_handler, jobs)
    while True:
        pass

2。多个map_async

from multiprocessing import Pool
from threading import Thread
from time import sleep


def job_handler(i):
    print("Doing job:", i)
    sleep(0.5)

def job_adder():
    i = 0
    while True:
        jobs.append(i)
        i += 1
        sleep(0.1)


if __name__ == "__main__":
    pool = Pool(4)
    jobs = []
    thr = Thread(target=job_adder)
    thr.start()
    while True:
        for job in jobs:
            pool1 = pool.map_async(job_handler, (job,))
            jobs.remove(job)

两者之间有什么区别?我认为第一种选择会更好,因为地图本身可以处理迭代。我的目标是获得更好的性能以分别处理每个作业。

1 个答案:

答案 0 :(得分:1)

在许多情况下都需要“减速” Pool。这种情况比some容易:

q=queue.Queue()
m=pool.imap(iter(q.get,None))

您还可以使用imap_unordered; None是终止Pool的标记。 Pool必须使用线程来收集任务(因为这些功能“比map()更懒”),并且它将根据需要在q上阻塞。