【发布时间】:2018-10-20 09:16:51
【问题描述】:
我正在使用多处理池一遍又一遍地为多个参数运行一个函数。我使用一个由另一个线程填充的作业列表和一个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)
两者有什么区别?我认为第一个选项会更好,因为地图本身会处理迭代。我的目标是获得更好的性能来分别处理每项工作。
【问题讨论】:
标签: python python-3.x python-multiprocessing