我打算编写一个简单的数据流框架,它基本上由对象的惰性方法调用组成。如果我曾经考虑过分布式编程,那么在 Python 中启用它的最简单方法是什么?没有我做网络编程的任何透明解决方案?
或者首先,如何在 Python 中使用多核处理器?
我打算编写一个简单的数据流框架,它基本上由对象的惰性方法调用组成。如果我曾经考虑过分布式编程,那么在 Python 中启用它的最简单方法是什么?没有我做网络编程的任何透明解决方案?
或者首先,如何在 Python 中使用多核处理器?
对象的惰性方法调用
真的可以是任何东西,所以让我们分解一下:
好幸运你!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 对象。
一些多层次的不仅仅是触发&忘记复杂的数据操作,或多步骤处理用例。
在这种情况下,您应该使用诸如ZeroMQ或RabbitMQ之类的消息代理。它们允许您轻松地跨多个服务器发送“消息”。
它们使您免于 TCP 领域的恐惧,但它们有点复杂(有些,如 RabbitMQ,需要一个单独的进程/服务器用于 Broker)。但是,它们可以让您对数据流进行更细粒度的控制,并帮助您构建真正可扩展的应用程序。
虽然本身不是数据分发,但它是 Web 服务器后端最热门的趋势:使用“绿色”线程(或事件或协程)将 IO 繁重的任务委托给专用线程,而应用程序代码正忙于最大化 -出CPU。
试试 Gearman http://gearman.org/
Gearman 提供了一个通用的应用程序框架,将工作外包给其他更适合完成工作的机器或进程。它允许您并行工作、负载平衡处理以及在语言之间调用函数。它可用于各种应用程序,从高可用性网站到数据库复制事件的传输。换句话说,它是分布式处理如何通信的神经系统。
请先阅读 python.org 官方资源:
您可能会考虑的另一个框架是Versile Python(完全披露:我是一名 VPy 开发人员)。文档配方有相关的代码示例。使用该框架,可以轻松设置和连接到服务,您可以为类定义显式公共方法接口或使用本机 python类型框架远程访问本地方法。
请注意,您必须将程序设置为在多个进程中运行才能利用多个内核(由于 python 全局解释器锁)。