python - master/worker 是否可扩展?

标签 python concurrency

我有一个使用单独的 python 进程实现的主/ worker 模型。主进程保存受互斥锁保护的作业/结果列表。许多工作进程在许多机器上运行(大约 200 个工作进程)。

我注意到,在每台机器上, worker 往往比其他 worker 进程多做 0-20% 或更少的工作,并且机器比其他机器多做 0-20% 或更少的工作。最快/最慢的 worker 和机器每天都不同。

这是主/ worker 模型的概念问题吗?它是否暗示实现有问题,或者一切都很好?

最佳答案

对于 +/- 20% 的情况,最简单的解释是您遇到了负载平衡问题;有些员工的工作量只比其他同事多 20%。这可能代表一个实现问题,也可能只是离散性;如果你有 200 个工作进程,但有 1040 个大致相等的工作要做,那么 1/5 的工作进程将有额外 20% 的工作要做,除非你可以分割工作,否则对此无能为力更精细。

Master/Worker 可以扩展(并像其他任何事情一样轻松地处理这些负载平衡问题),直到主进程中对共享资源的争用开始变得不平凡。您可以通过将关键部分(受互斥体保护的部分)减少到绝对最小值来稍微向前扩展;通过聚合工作单元来减少请求(但请注意,这与改善负载平衡的方向相反);或者通过拥有多个主人(可能是主人的层次结构)。如果这不起作用,您必须开始考虑更多的点对点工作调度算法,这样就不再存在单一瓶颈。 master/worker 的点对点类似物称为 work stealing ,这是(恕我直言)似乎不应该起作用的事情之一,直到有人向你展示它确实有效;它最近被 Cilk 所普及。 。这个想法是,每个人都会得到一份任务 list ,如果同伴需要更多的工作,他们会随机地从对方那里窃取任务,然后继续努力,直到完成。实现起来比master/worker更复杂,但避免了单master瓶颈。

关于python - master/worker 是否可扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015348/

相关文章:

python - 我可以用 Python/OpenCV 复制 GIMP 的 HSL 复合函数吗?

multithreading - 多线程程序如何更节能?

java - 如何编写简单的公平信号量?

angularjs - 服务器挂起运行 "concurrent:server"(并发)任务

java - 对象与条件,wait() 与 await()

Python:如何在Popen打开子进程结束时得到通知

python - 获取轴 matplotlib 的所有艺术家?

python - 在 3D 中绘制正态分布

python - Sphinx 和可重复使用的 Django 应用程序

java - Java 是否提供一个 ExecutorService 允许一个 worker 在同一个线程上执行?