简短的问题:是否可能有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我熟悉multiprocessing
Process
类和进程池,但是:
Process
实例都会启动一个进程(是:)-我想要固定数量的工人Process
实例,它可以使泛型工作
我建议你看看
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的实例没有任何问题。在
如果你有固定数量的工作要做,你可以创建一个“没有更多的工作要做”的工作单元(一个“毒丸”),告诉一个工人关闭,在所有的常规工作都被放入队列后,把你有多少工人的毒丸放入队列。在
相关问题 更多 >
编程相关推荐