gpt4 book ai didi

python - 强制多处理池迭代参数

转载 作者:行者123 更新时间:2023-12-01 08:53:56 25 4
gpt4 key购买 nike

我正在使用多处理池反复运行多个参数的函数。我使用由另一个线程填充的作业列表和一个 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)

两者有什么区别?我认为第一个选项会更好,因为 map 本身可以处理迭代。我的目标是获得更好的性能来分别处理每项工作。

最佳答案

在许多情况下都会出现“减慢”速度的需要。这个案例比some更容易:

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

您还可以使用imap_unorderedNone 是终止Pool 的哨兵。 必须使用线程来收集任务(因为这些函数“比]map()更懒”),并且它将在q上阻塞 根据需要。

关于python - 强制多处理池迭代参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52904126/

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