3

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

2 回答 2

6

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

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

Python multiprocessing.Pool:何时使用 apply、apply_async 或 map?

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

并行文件匹配,Python

于 2012-07-16T21:11:26.947 回答
3

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

如果你有固定的工作要做,你可以创建一个“没有更多工作要做”的工作单元(一个“毒丸”),告诉工人关闭,并且在所有常规工作都投入之后队列,将尽可能多的毒丸放入队列中,因为你有工人。

于 2012-07-16T19:36:37.723 回答