我正在尝试将作业逐个发送到池中(由于内存限制,我无法使用map)。如果有可用的工作人员,否则池可以消化,否则等待?
例如我可以这样做吗?
p = Pool(n_workers)
for item in list:
p.work_on_this(item)
如果池中有更多可用的工作者,则work_on_this
发送作业,否则等待它发生。
答案 0 :(得分:0)
解决问题的方法是使用一个用工人数量初始化的信号量。您在进入池之前以及在工人完成任务之后获取并释放信号量。
以下是使用Python 2.6或更高版本的示例。
from threading import Semaphore
from multiprocessing import Pool
def TaskManager:
def __init__(self, processes):
self.pool = Pool(processes=processes)
self.workers = Semaphore(processes)
def new_task(self):
"""Start a new task, block if all workers are busy."""
self.workers.acquire()
self.pool.apply_async(function, callback=self.task_done)
def task_done(self, results):
"""Called once task is done, releases the caller if blocked."""
self.workers.release()