首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的分布式编程

Python中的分布式编程
EN

Stack Overflow用户
提问于 2012-04-22 16:48:43
回答 4查看 10.4K关注 0票数 7

我计划编写一个简单的数据流框架,它基本上由对象的惰性方法调用组成。如果我曾经考虑过分布式编程,那么在Python中启用分布式编程的最简单方法是什么?不需要我做网络编程,有没有什么透明的解决方案?

或者首先,我如何在Python中使用多核处理器?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-23 02:10:29

对象的

惰性方法调用

可以是任何东西,所以让我们把它分解一下:

简单的让我调用那个函数(RPC)

那你就走运了!python拥有远程过程调用最伟大的实现之一:RPyC

只需运行服务器(双击文件,请参阅教程),

打开解释器,然后:

代码语言:javascript
复制
import rpyc
conn = rpyc.classic.connect("localhost")
data_obj = conn.modules.lazyme.AwesomeObject("ABCDE")
print(data_obj.calculate(10))

和一个惰性版本(异步):

代码语言:javascript
复制
# wrap the remote function with async(), which turns the invocation asynchronous
acalc = rpyc.async(data_obj.calculate)
res = acalc(10)
print(res.ready, res.value)

简单的数据分布

你有一个定义好的工作单元,比如说一个复杂的图像操作。您要做的就是粗略地创建Node(s),它负责实际工作(也就是获取图像、进行操作并返回结果)、收集结果的人员( Sink)和创建工作的人员( Distributor)。

看看Celery吧。

如果它的规模非常小,或者您只是想使用它,请参阅multiprocessing包中的Pool对象:

代码语言:javascript
复制
from multiprocessing import Pool
p = Pool(5)
def f(x):
     return x*x
print(p.map(f, [1,2,3]))

还有真正懒惰的版本:

代码语言:javascript
复制
print(p.map_async(f, [1,2,3]))

它返回一个可以检查结果的结果对象。

复杂数据分布

一些多层次的不仅仅是简单的数据操作,或者是多步骤处理的用例。

在这种情况下,您应该使用消息代理,如ZeroMQRabbitMQ。它们允许您轻松地跨多个服务器发送“消息”。

它们将您从TCP域的恐怖中解救出来,但是它们有点复杂(有些,比如RabbitMQ,需要为代理使用单独的进程/服务器)。但是,它们为您提供了对数据流的更细粒度的控制,并帮助您构建真正可伸缩的应用程序。

懒惰-任何事

虽然不是数据分发本身,但它是web服务器后端中最热门的趋势:使用“绿色”线程(或事件或协程)将IO繁重的任务委托给专用线程,而应用程序代码则忙于消耗CPU。

我非常喜欢Eventletgevent是另一个选择。

票数 15
EN

Stack Overflow用户

发布于 2012-04-22 17:42:49

试试Gearman http://gearman.org/

Gearman提供了一个通用的应用程序框架,将工作外包给更适合做这项工作的其他机器或进程。它允许你并行工作,负载平衡处理,以及在不同语言之间调用函数。它可用于各种应用程序,从高可用性网站到数据库复制事件的传输。换句话说,它是分布式处理如何通信的神经系统。

票数 2
EN

Stack Overflow用户

发布于 2012-04-22 17:04:29

作为初学者,请阅读python.org官方资源:

http://wiki.python.org/moin/ParallelProcessing

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10266531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档