pat*_*ter 5 python parallel-processing module
我今年夏天正在做一些研究,并致力于并行化已有的代码.现在主要关注的是一种对代码进行负载平衡的方法,以便它在集群上运行更高效.当前的任务是创建一个概念证明,创建几个进程,每个进程都有自己的堆栈可用,当进程完成处理堆栈时,它会查询两个最接近的进程,看看他们的堆栈中是否有更多可用的工作.
我在python中对此进行概念化时遇到了困难,但希望有人能指出我正确的方向,或者在mpi4py或ParallelPython中有类似的例子.此外,如果有人知道更好或更容易的模块,那么这将是很好的知道.
谢谢.
S.L*_*ott 11
这是一个简单的方法.
创建一个共同的工作共享队列.此应用程序将完成此队列的工作.
创建一个从队列中获取一个项目的应用程序,并完成工作.
这是单生产者 - 多消费者设计.它运行良好,可以通过并行流程淹没您的机器.
要使用内置队列类,需要将队列包装在某种多处理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
Run Code Online (Sandbox Code Playgroud)
这将运行您的应用程序的10个并发副本.所有10个人都试图从一个队列中获得工作.他们将使用所有可用的CPU资源,操作系统将很好地为您安排它们.
对等节点到节点同步意味着所有节点之间都有O(n*(n-1)/ 2)个通信路径.
"两个相邻节点"意味着您仍然有2*n个通信路径,并且工作必须"以某种方式"在节点之间流淌.如果节点最初都是通过工作播种的,那么有人会做很多计划来平衡工作量.如果您要做那么多计划,为什么要求节点同步?
如果队列没有仔细平衡,那么每个偶数节点都可能很慢.每个奇数节点都可以很快.奇数节点首先完成,检查两个偶数节点的工作,这些节点是(a)未完成的,(b)也没有更多的工作要做.现在怎么办?一半节点正在工作,一半节点空闲.一切都归功于最初的工作分配计划不周.
主从意味着您有n个通信路径.此外,平衡是自动的,因为所有空闲节点具有相同的工作访问权限.没有偏见的初始分布导致整体表现不佳.
| 归档时间: |
|
| 查看次数: |
14200 次 |
| 最近记录: |