使用IPython Parallel(或其他包)的令人尴尬的并行任务取决于不可解决的对象

时间:2013-03-05 15:22:00

标签: python parallel-processing ipython ipython-parallel

我常常遇到问题,我想快速地在一组很多很多物体上做一些简单的事情。我的自然选择是使用IPython Parallel,因为它简单,但我经常需要处理不可用的对象。尝试几个小时之后,我通常会让自己在一台计算机上过夜运行我的玩家,或者做一个愚蠢的事情,比如半手动划分以运行多个python脚本。

举一个具体的例子,假设我要删除给定S3存储桶中的所有密钥。

我通常不假思索地做的是:

import boto
from IPython.parallel import Client

connection = boto.connect_s3(awskey, awssec)
bucket = connection.get_bucket('mybucket')

client = Client()
loadbalancer = c.load_balanced_view()

keyList = list(bucket.list())
loadbalancer.map(lambda key: key.delete(), keyList)

问题是Key中的boto对象是不可用的(*)。对于我来说,这经常发生在不同的环境中。这也是多处理,execnet以及我尝试过的所有其他框架和库的问题(原因很明显:它们都使用相同的pickler来序列化对象)。

你们也有这些问题吗?有没有办法可以序列化这些更复杂的对象?我是否必须为这个特定的对象编写自己的pickler?如果我这样做,我如何告诉IPython Parallel使用它?我怎么写一个pickler?

谢谢!


(*)我知道我可以简单地列出一些键名,并做一下这样的事情:

loadbalancer.map(lambda keyname: getKey(keyname).delete())

并在IPython集群的每个引擎中定义getKey函数。这只是我经常发现的更普遍问题的特定实例。也许这是一个糟糕的例子,因为它可以通过另一种方式轻松解决。

2 个答案:

答案 0 :(得分:2)

IPython有一个use_dill选项,如果您安装了dill序列化程序,则可以序列化大多数“不可取消”的对象。

How can I use dill instead of pickle with load_balanced_view

答案 1 :(得分:0)

IPython确实将人们聚集在一起;)。因此,从我能够收集到的,酸洗物体的问题是他们的方法。因此,可能不是使用key的方法来删除它,而是可以编写一个接收它并删除它的函数。也许首先得到一个dict的列表,其中包含每个键的相关信息,然后再调用一个函数delete_key( dict ),我留给你写,因为我不知道如何处理s3键

那会有用吗?


或者,它可能是这样的:只是调用实例的方法,而不是调用实例的方法,以实例作为参数调用类的方法。因此,lambda key : key.delete()代替lambda key : Key.delete(key) class stuff(object): def __init__(self,a=1): self.list = [] def append(self, a): self.list.append(a) import IPython.parallel as p c = p.Client() dview = c[:] li = map( stuff, [[]]*10 ) # creates 10 stuff instances dview.map( lambda x : x.append(1), li ) # should append 1 to all lists, but fails dview.push({'stuff':stuff}) # push the class to the engines dview.map( lambda x : stuff.append(x,1), li ) # this works. 。当然,你必须将类推送到节点,但这应该不是问题。一个最小的例子:

{{1}}