python - 使用 Python 实现负载均衡

标签 python parallel-processing module

今年夏天我正在做一些研究,致力于并行化预先存在的代码。现在的主要焦点是一种负载平衡代码的方法,以便它在集群上更高效地运行。当前的任务是进行概念验证,创建多个进程,每个进程都有自己的可用堆栈,当进程完成处理堆栈时,它会查询最近的两个进程,看看它们的堆栈中是否还有可用的工作。

我在用 python 概念化这个问题时遇到了困难,但希望有人能给我指出正确的方向,或者有一些类似于 mpi4py 或 ParallelPython 的例子。此外,如果有人知道更好或更简单的模块,那将是一件很棒的事情。

谢谢。

最佳答案

这里有一个简单的方法来做到这一点。

  1. 创建一个共同的共享工作队列。这个应用程序 将用要做的工作填满这个队列。

  2. 创建一个应用程序,它从队列中获取一个项目并完成工作。

这是单生产者多消费者设计。它运行良好,可以让并行进程淹没您的机器。

要使用内置的队列类,你需要用某种方式包装队列 多处理API。 http://docs.python.org/library/queue.html .就个人而言,我喜欢创建一个基于 HTTP 的小型 Web 服务器来处理队列。每个应用程序做一个 GET 获取下一个工作。

您可以使用像 RabbitMQ 这样的工具来创建一个非常好的共享队列。 http://nathanborror.com/posts/2009/may/20/working-django-and-rabbitmq/

您也许可以使用 http://hjb.python-hosting.com/使用 JMS 队列。

您需要一个小型应用程序来创建队列并用工作填充队列。

根据需要创建尽可能多的应用程序副本。例如:

for i in 1 2 3 4 5 6 7 8 9 10
do
    python myapp.py &
done

这将同时运行您的应用程序的 10 个副本。所有 10 个都试图从一个队列中获取工作。它们将使用所有可用的 CPU 资源,操作系统会很好地为您安排它们。


点对点同步意味着您在所有节点之间拥有 O(n*(n-1)/2) 条通信路径。

“两个相邻的节点”意味着您仍然有 2*n 条通信路径,并且工作必须“以某种方式”在节点之间进行。如果所有节点最初都播种了工作,那么有人会做很多计划来平衡工作负载。如果您要进行那么多计划,为什么要让节点完全同步?

如果队列一开始就没有仔细平衡,那么每个偶数节点都可能很慢。每个奇数节点都可能很快。奇数节点首先完成,检查两个偶数节点的工作,并且这些节点 (a) 未完成且 (b) 也没有更多工作要做。现在怎么办?一半节点工作,一半空闲。都是因为最初的工作分配计划不周。

主从意味着你有n条通信路径。此外,平衡是自动的,因为所有空闲节点都有平等的工作机会。不存在导致整体性能不佳的初始分布偏差这样的事情。

关于python - 使用 Python 实现负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3321722/

相关文章:

python - 为什么三元条件不能完美地用于字符串连接

python - 复数字符串格式

python - 如何将 asyncio 用于并行任务

module - 如何从特定模块创建所有装饰函数的向量?

module - Elixir - 'use' 关键字有什么作用?

python - 无法使用networkx添加边或节点

python - Python 中的数密度等值线

java - 并行读取大型 XSLT 字符串

haskell - 为什么以下内容会并行运行而不是顺序运行?

python - 导入错误 : No module named backend_tkagg