7

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

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

4

4 回答 4

15

对象的惰性方法调用

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

简单的 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))

还有一个惰性版本(异步):

# 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),它执行实际工作(也就是拍摄图像,进行操作并返回结果),收集结果的人(a Sink)和创建工作的人(the Distributor)。

看看芹菜

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

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]))

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

复杂的数据分布

一些多层次的不仅仅是触发&忘记复杂的数据操作,或多步骤处理用例。

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

它们使您免于 TCP 领域的恐惧,但它们有点复杂(有些,如 RabbitMQ,需要一个单独的进程/服务器用于 Broker)。但是,它们可以让您对数据流进行更细粒度的控制,并帮助您构建真正可扩展的应用程序。

懒惰的任何东西

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

我非常喜欢Eventlet,而gevent是另一种选择。

于 2012-04-22T18:10:29.043 回答
2

试试 Gearman http://gearman.org/

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

于 2012-04-22T09:42:49.043 回答
1

请先阅读 python.org 官方资源:

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

于 2012-04-22T09:04:29.440 回答
1

您可能会考虑的另一个框架是Versile Python(完全披露:我是一名 VPy 开发人员)。文档配方有相关的代码示例。使用该框架,可以轻松设置和连接到服务,您可以为类定义显式公共方法接口或使用本机 python类型框架远程访问本地方法。

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

于 2012-05-01T11:00:01.120 回答