我經常遇到問題,我想快速地對一組很多對象做簡單的事情。我自然選擇使用IPython Parallel來簡化它,但我經常需要處理不可取的對象。在嘗試幾個小時後,我通常會自己辭職,讓我在一臺計算機上過夜,或者做一件愚蠢的事情,比如將事情分成半手動方式運行在多個Python腳本中。使用IPython並行(或其他包)取決於不可取的對象的可伸縮並行任務
舉一個具體的例子,假設我想刪除給定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
是unpickable(*)。這對我來說經常發生在不同的環境中。對於多處理,execnet以及我嘗試過的所有其他框架和庫,這也是一個問題(原因很明顯:它們都使用相同的pickler來序列化對象)。
你們是否也有這些問題?有沒有一種方法可以序列化這些更復雜的對象?我是否必須爲這些特定對象編寫自己的pickler?如果我這樣做,我該如何告訴IPython Parallel使用它?我如何寫一個pickler?
謝謝!
(*)我知道,我可以簡單地做鑰匙的名單,做這樣的事情:
loadbalancer.map(lambda keyname: getKey(keyname).delete())
,並在IPython的集羣中的每個引擎定義getKey
功能。這只是我經常發現的一個更普遍問題的一個特例。也許這是一個不好的例子,因爲它可以通過其他方式輕鬆解決。
我敢肯定,任務沒有你取笑他們對SO足夠的尷尬! – 2013-03-05 15:23:11