Python中的分布式编程

Python中的分布式编程,python,distributed,Python,Distributed,我计划编写一个简单的数据流框架,它基本上由对象的惰性方法调用组成。如果我考虑过分布式编程,在Python中最容易实现的方法是什么?没有我做网络编程的透明解决方案 或者首先,如何使用Python中的多核处理器?请阅读Python.org官方资源: 试试Gearman Gearman提供了一个通用的应用程序框架来将工作分配给 更适合做这项工作的其他机器或工艺。信息技术 允许您并行工作、负载平衡处理和 在语言之间调用函数。它可以用在各种场合 应用程序,从高可用性网站到 数据库复制事件。换句话说,它是神

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


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

请阅读Python.org官方资源:

试试Gearman

Gearman提供了一个通用的应用程序框架来将工作分配给 更适合做这项工作的其他机器或工艺。信息技术 允许您并行工作、负载平衡处理和 在语言之间调用函数。它可以用在各种场合 应用程序,从高可用性网站到 数据库复制事件。换句话说,它是神经系统 了解分布式处理的通信方式

对象的惰性方法调用

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

简单让我调用该函数(RPC) 你真幸运!python拥有最伟大的远程过程调用实现之一:

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

打开一个口译员,然后:

import rpyc
conn = rpyc.classic.connect("localhost")
data_obj = conn.modules.lazyme.AwesomeObject("ABCDE")
print(data_obj.calculate(10))
和惰性版本(异步):

简单数据分布 您有一个已定义的工作单元,例如复杂的图像处理。 您所做的是大致创建
节点(s),它执行实际工作(即拍摄图像、进行操作并返回结果)、收集结果的人(一个
接收器
)和创建工作的人(分发者

看一看

如果它的规模非常小,或者您只想玩它,请参阅
多处理
包中的
对象:

from multiprocessing import Pool
p = Pool(5)
def f(x):
     return x*x
print(p.map(f, [1,2,3]))
真正懒惰的版本是:

print(p.map_async(f, [1,2,3]))
它返回一个可以检查结果的结果对象

复杂数据分布 一些多层次的应用程序不仅仅是激发&忘记复杂的数据操作,或者多步骤处理用例

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

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

懒惰的东西 虽然不是数据分发本身,但这是web服务器后端最热门的趋势:使用“绿色”线程(或事件、或协同路由)将IO繁重的任务委托给专用线程,而应用程序代码正忙于最大化CPU


我喜欢很多,而且是另一个选项。

你可以考虑的另一个框架是(完全公开:我是VPY开发者)。文档中有相关的代码示例。使用该框架可以轻松地设置和连接到服务,您可以定义类的显式公共方法接口,也可以使用类型框架远程访问本地方法


注意:为了利用多个内核(由于python全局解释器锁),您必须将程序设置为在多个进程中运行

@Karoly:如果我知道那里的任何技术术语,我都不会问(CORBA、RPC、Cloud)。我已经看到了。但我不知道fork/job/cluster/grid是什么意思。也许你可以概述不同之处并提出适当的解决方案?我自己能找到的真正的图书馆。因为你的问题很模糊,你得到的答案也很模糊。对于这个不具体的问题,我恐怕这是你可能得到的最好答案。我建议你先编写应用程序,然后带着更具体的问题回来,或者花时间研究不同的解决方案。同样,对于非常基本的需求,这已经足够了:这些问题并不含糊,但应该表明我对这个主题不太了解(这就是为什么它是一个问题)。因此,答案可以相应地调整,以解释基本概念。但也许你最后的评论是一个开始。谢谢。@Karoly:我不是为了能挑一个我真正需要的主题而成为所有IT主题的专家。你希望我成为集群系统管理员,即使我很可能不需要?如果有人问你一个问题,你总是用谷歌来回答吗?谢谢。听起来很有趣:)哇,这真的很有用:)我需要一段时间才能完成这些选项。但首先我完成了我的数据流框架。用Python可以做的事情非常酷。
print(p.map_async(f, [1,2,3]))