Python多处理负载均衡器

时间:2012-07-16 18:49:44

标签: python performance parallel-processing multiprocessing

简短问题:是否可以让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实例可以进行通用工作

2 个答案:

答案 0 :(得分:4)

我建议你看一下multiprocessing.Pool(),因为我相信它能解决你的问题。它运行N个“工作进程”,当每个工作完成一个任务时,提供另一个任务。并且不需要“毒丸”;这很简单。

我一直在游泳池上使用.map()方法。

Python multiprocessing.Pool: when to use apply, apply_async or map?

编辑:这是我写给另一个问题的答案,我在答案中使用了multiprocessing.Pool()

Parallel file matching, Python

答案 1 :(得分:2)

平衡器中您不需要任何智能;单独的队列将做你想要的。将每个工作单元放入队列中,让工作器循环,从队列中取出一个工作单元并在每次迭代时处理它。我认为通过队列传递UnitOfWork实例没有任何问题。

如果你有一定数量的工作需要完成,你可以创建一个“不再需要做的工作”的工作单位(一个“毒丸”),告诉工人关闭,并在所有的正常工作之后被放入队列中,与工人一样,将尽可能多的毒丸放入队列中。