使用Python实现负载均衡

9 投票
2 回答
25666 浏览
提问于 2025-04-16 01:44

我这个夏天在做一些研究,主要是把已有的代码进行并行处理。现在的重点是找到一种方法来平衡负载,让代码在集群上运行得更高效。目前的任务是做一个概念验证,创建几个进程,每个进程都有自己的工作堆栈。当一个进程处理完它的堆栈后,它会去询问两个离它最近的进程,看看它们的堆栈里是否还有其他工作可以做。

我在用Python实现这个想法时遇到了一些困难,希望有人能给我指个方向,或者提供一些类似的例子,最好是用mpi4py或ParallelPython。如果有人知道更好或更简单的模块,那就太好了。

谢谢。

2 个回答

-2

使用 multiprocessing 模块

14

这里有一个简单的方法来实现这个目标。

  1. 首先,创建一个共享的工作队列。这个应用程序会把需要做的工作放到这个队列里。

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

这就是单生产者多消费者的设计。这种方式效果很好,可以让你的机器同时处理很多任务。

如果要使用内置的队列类,你需要把队列放在某种多进程的API中。http://docs.python.org/library/queue.html。我个人喜欢创建一个小的基于HTTP的网络服务器来处理这个队列。每个应用程序通过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的通信路径,工作必须在节点之间“以某种方式”流动。如果所有节点最开始都有工作,那么有人做了很多规划来平衡工作负载。如果你要做这么多规划,为什么还要让节点进行同步呢?

如果队列最开始没有被仔细平衡,那么每个偶数节点可能会很慢,而每个奇数节点可能会很快。奇数节点先完成工作,检查两个偶数节点的工作情况,而这两个节点要么还没完成,要么也没有更多的工作可做。那怎么办?一半的节点在工作,一半的节点在闲着。这一切都是因为最初的工作分配规划不当。

主从模式意味着你有n条通信路径。此外,负载平衡是自动的,因为所有闲置的节点都有平等的工作访问权。没有偏向性的初始分配会导致整体性能不佳的情况。

撰写回答