我计划编写一个简单的数据流框架,它基本上由对象的惰性方法调用组成。如果我曾经考虑过分布式编程,那么在Python中启用分布式编程的最简单方法是什么?不需要我做网络编程,有没有什么透明的解决方案?
或者首先,我如何在Python中使用多核处理器?
发布于 2012-04-23 02:10:29
对象的
惰性方法调用
可以是任何东西,所以让我们把它分解一下:
简单的让我调用那个函数(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),它负责实际工作(也就是获取图像、进行操作并返回结果)、收集结果的人员( Sink)和创建工作的人员( Distributor)。
看看Celery吧。
如果它的规模非常小,或者您只是想使用它,请参阅multiprocessing包中的Pool对象:
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]))它返回一个可以检查结果的结果对象。
复杂数据分布
一些多层次的不仅仅是简单的数据操作,或者是多步骤处理的用例。
在这种情况下,您应该使用消息代理,如ZeroMQ或RabbitMQ。它们允许您轻松地跨多个服务器发送“消息”。
它们将您从TCP域的恐怖中解救出来,但是它们有点复杂(有些,比如RabbitMQ,需要为代理使用单独的进程/服务器)。但是,它们为您提供了对数据流的更细粒度的控制,并帮助您构建真正可伸缩的应用程序。
懒惰-任何事
虽然不是数据分发本身,但它是web服务器后端中最热门的趋势:使用“绿色”线程(或事件或协程)将IO繁重的任务委托给专用线程,而应用程序代码则忙于消耗CPU。
我非常喜欢Eventlet,gevent是另一个选择。
发布于 2012-04-22 17:42:49
试试Gearman http://gearman.org/
Gearman提供了一个通用的应用程序框架,将工作外包给更适合做这项工作的其他机器或进程。它允许你并行工作,负载平衡处理,以及在不同语言之间调用函数。它可用于各种应用程序,从高可用性网站到数据库复制事件的传输。换句话说,它是分布式处理如何通信的神经系统。
发布于 2012-04-22 17:04:29
作为初学者,请阅读python.org官方资源:
http://wiki.python.org/moin/ParallelProcessing
https://stackoverflow.com/questions/10266531
复制相似问题