我常常遇到问题,我想快速地在一组很多很多物体上做一些简单的事情。我的自然选择是使用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
函数。这只是我经常发现的更普遍问题的特定实例。也许这是一个糟糕的例子,因为它可以通过另一种方式轻松解决。
答案 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}}