Python中的分布式编程

Ger*_*nuk 6 python distributed

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

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

Oha*_*had 14

惰性方法调用对象

真的可以是任何东西,所以让我们制造它:

简单的Let-Me-Call-That-Function(RPC)

祝你好运!python具有远程过程调用的最佳实现之一: RPyC.

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

打开翻译并:

import rpyc
conn = rpyc.classic.connect("localhost")
data_obj = conn.modules.lazyme.AwesomeObject("ABCDE")
print(data_obj.calculate(10))
Run Code Online (Sandbox Code Playgroud)

和懒惰的版本(异步):

# 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)
Run Code Online (Sandbox Code Playgroud)

简单的数据分发

您有一个已定义的工作单元,比如复杂的图像处理.你所做的大致是创造Node,它做实际工作(也就是说,拍摄图像,做操作,并返回结果),收集结果的人(a Sink)和创作作品的人(Distributor).

看看芹菜吧.

如果它的规模非常小,或者您只是想玩它,请查看包中的Pool对象multiprocessing:

from multiprocessing import Pool
p = Pool(5)
def f(x):
     return x*x
print(p.map(f, [1,2,3]))
Run Code Online (Sandbox Code Playgroud)

真正懒惰的版本:

print(p.map_async(f, [1,2,3]))
Run Code Online (Sandbox Code Playgroud)

返回一个Result对象,可以检查结果.

复杂数据分布

一些多层次的,不仅仅是火灾和忘记复杂的数据操作,或者是一个多步骤处理用例.

在这种情况下,您应该使用诸如ZeroMQRabbitMQ之类的Message Broker .它们允许您轻松地在多个服务器上发送"消息".

它们可以帮助您避免TCP域的恐怖,但它们有点复杂(有些像RabbitMQ,需要为Broker提供单独的进程/服务器).但是,它们可以为您提供更精细的数据流控制,并帮助您构建真正可扩展的应用程序.

懒惰什么

虽然不是数据分发本身,但它是Web服务器后端最热门的趋势:使用"绿色"线程(或事件或协同程序)将IO繁重任务委派给专用线程,而应用程序代码忙于最大化 - 出CPU.

我很喜欢Eventlet,而gevent是另一种选择.