简短问题:是否可以让N
个工作流程和balancer
流程找到工作人员此时什么都不做并将UnitOfWork
传递给它?
长问题: 想象一下这样的类,女巫将被分类为某些任务:
class UnitOfWork:
def __init__(self, **some_starting_parameters):
pass
def init(self):
# open connections, etc.
def run(self):
# do the job
启动平衡器和工作进程:
balancer = LoadBalancer()
workers = balancer.spawn_workers(10)
部署工作(平衡器应该找到一个懒惰的工作者,并将任务传递给它,否则如果每个工作人员都忙,将UOW添加到队列并等到自由工作者):
balancer.work(UnitOfWork(some=parameters))
# internally, find free worker, pass UOW, ouw.init() + ouw.run()
这可能(或者它是疯了)?
PS我熟悉multiprocessing
Process
类和进程池,但是:
Process
实例都启动一个进程(是的:)) - 我想要固定数量的工作者Process
实例可以进行通用工作答案 0 :(得分:4)
我建议你看一下multiprocessing.Pool()
,因为我相信它能解决你的问题。它运行N个“工作进程”,当每个工作完成一个任务时,提供另一个任务。并且不需要“毒丸”;这很简单。
我一直在游泳池上使用.map()
方法。
Python multiprocessing.Pool: when to use apply, apply_async or map?
编辑:这是我写给另一个问题的答案,我在答案中使用了multiprocessing.Pool()
。
答案 1 :(得分:2)
平衡器中您不需要任何智能;单独的队列将做你想要的。将每个工作单元放入队列中,让工作器循环,从队列中取出一个工作单元并在每次迭代时处理它。我认为通过队列传递UnitOfWork实例没有任何问题。
如果你有一定数量的工作需要完成,你可以创建一个“不再需要做的工作”的工作单位(一个“毒丸”),告诉工人关闭,并在所有的正常工作之后被放入队列中,与工人一样,将尽可能多的毒丸放入队列中。