我正在使用多处理池来一遍又一遍地运行多个参数的函数。我使用由另一个线程填充的作业列表和一个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)
两者之间有什么区别?我认为第一种选择会更好,因为地图本身可以处理迭代。我的目标是获得更好的性能以分别处理每个作业。
答案 0 :(得分:1)
在许多情况下都需要“减速” Pool
。这种情况比some容易:
q=queue.Queue()
m=pool.imap(iter(q.get,None))
您还可以使用imap_unordered
; None
是终止Pool
的标记。 Pool
必须使用线程来收集任务(因为这些功能“比map()
更懒”),并且它将根据需要在q
上阻塞。