【问题标题】:Python multiprocessing load balancerPython 多处理负载均衡器
【发布时间】:2012-07-15 16:10:00
【问题描述】:

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

【问题讨论】:

    标签: python performance parallel-processing multiprocessing


    【解决方案1】:

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

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

    【讨论】:

    • omg :) 更复杂的任务是,它有最简单的答案 :D - 你刚刚意识到我已经在另一个项目中做过类似的事情,但我并没有从那个角度看...
    【解决方案2】:

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

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

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

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

    Parallel file matching, Python

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 2021-12-07
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      相关资源
      最近更新 更多