Python多处理负载平衡

2024-09-30 01:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

简短的问题:是否可能有N工作进程和一个balancer进程,该进程将找到此时不执行任何操作的worker并将UnitOfWork传递给它?在

长问题: 想象这样的类,witch将为某些任务创建子类:

class UnitOfWork:
  def __init__(self, **some_starting_parameters):
    pass
  def init(self):
    # open connections, etc.
  def run(self):
    # do the job

启动平衡器和工作进程:

^{pr2}$

部署工作(平衡器应该找到一个懒惰的工作线程,并将任务传递给它,否则,如果每个工作线程都很忙,请将UOW添加到队列中,等待空闲工作线程):

balancer.work(UnitOfWork(some=parameters))
# internally, find free worker, pass UOW, ouw.init() + ouw.run()

这是可能的(还是疯狂的)?在

PS我熟悉multiprocessingProcess类和进程池,但是:

  • 每个Process实例都会启动一个进程(是:)-我想要固定数量的工人
  • 我想要Process实例,它可以使泛型工作

Tags: runself进程initdefsomepass线程
2条回答

我建议你看看multiprocessing.Pool(),因为我相信它确实解决了你的问题。它运行N个“worker进程”,当每个worker完成一个任务时,将提供另一个任务。也不需要“毒丸”,很简单。在

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

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

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

Parallel file matching, Python

您不需要在平衡器中使用任何智能;只有队列可以满足您的需要。将每个工作单元放入队列中,让workers循环,从队列中提取一个工作单元,并在每次迭代中处理它。我认为在队列中传递UnitOfWork的实例没有任何问题。在

如果你有固定数量的工作要做,你可以创建一个“没有更多的工作要做”的工作单元(一个“毒丸”),告诉一个工人关闭,在所有的常规工作都被放入队列后,把你有多少工人的毒丸放入队列。在

相关问题 更多 >

    热门问题