2012-07-16 83 views
1

简短的问题:是否有可能有N工作进程和balancer进程,它会发现工人在这个时候什么也不做,并通过UnitOfWork它?Python多处理负载平衡器

长的问题: 想像这样的类,女巫会被继承某些任务:

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我熟悉multiprocessingProcess类,并处理池,但:

  • Process实例启动一个进程(是的:)) - 我想工人的固定NUM
  • 我想Process可以制作通用作品的实例

回答

2

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

如果你有一个固定的工作量要完成,你可以创建一个“不需要做的工作”的工作单位(一个“毒药丸”),告诉工人关闭,并且毕竟经常工作被放入队列中,将许多毒丸放入队列中,与工人一样。

+0

OMG :)更复杂的任务,它具有最简单的答案:d - 你刚刚意识到,我已经做了在另一个项目这样的事情,但我没有从这个角度来看期待... – canni 2012-07-16 19:46:23

3

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

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

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

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

Parallel file matching, Python