pickleとジョブフローのメモ¶
Pickle化するコードと読み込み¶
tree
.
├── item.py
├── pickle_sample.py
├── user.py
└── users.pickle
pickle_sample.py¶
import pickle
import user
import item
user1 = user.User(1, 'A')
user2 = user.User(2, 'B')
item1 = item.Item('I1')
item2 = item.Item('I2')
user1.append_items([item1, item2])
user2.append_items([item1, item2])
users = [user1, user2]
print(users)
with open('users.pickle', 'wb') as f:
pickle.dump(users, f)
with open('users.pickle', 'rb') as f:
users_loaded = pickle.load(f)
print(users_loaded)
user.py¶
class User:
def __init__(self, id, name):
self.id = id
self.name = name
self.items = []
def __repr__(self):
return '<%s(%s): %s>' % (self.__class__, id(self), self.__dict__)
def append_items(self, items):
for i in items:
self.items.append(i)
item.py¶
class Item:
def __init__(self, name):
self.name = name
def __repr__(self):
return '<%s(%s): %s>' % (self.__class__, id(self), self.__dict__)
run¶
python pickle_sample.py
[<<class 'user.User'>(4330090336): {'items': [<<class 'item.Item'>(4330307768): {'name': 'I1'}>, <<class 'item.Item'>(4330622592): {'name': 'I2'}>], 'id': 1, 'name': 'A'}>, <<class 'user.User'>(4330307712): {'items': [<<class 'item.Item'>(4330307768): {'name': 'I1'}>, <<class 'item.Item'>(4330622592): {'name': 'I2'}>], 'id': 2, 'name': 'B'}>]
[<<class 'user.User'>(4330622704): {'items': [<<class 'item.Item'>(4330635336): {'name': 'I1'}>, <<class 'item.Item'>(4330635560): {'name': 'I2'}>], 'id': 1, 'name': 'A'}>, <<class 'user.User'>(4330635728): {'items': [<<class 'item.Item'>(4330635336): {'name': 'I1'}>, <<class 'item.Item'>(4330635560): {'name': 'I2'}>], 'id': 2, 'name': 'B'}>]
モジュールを読み込めないディレクトリでPickle読み込み¶
mkdir test && cd test
python -c "
import pickle
with open('../users.pickle', 'rb') as f:
users_loaded = pickle.load(f)
print(users_loaded)
"
Traceback (most recent call last):
File "<string>", line 4, in <module>
ImportError: No module named 'user'
pickle化したオブジェクトの再利用¶
ジョブフローの落ちたジョブの再実行用にジョブ内容をpickle化したいなと考えていた
- 再利用するには、実行した時と同じコードのモジュールが必要
- バージョン管理が基本の今、gitのHash値などと合わせて確実に再利用できる
その他ジョブ実行のフロー用のメモ¶
- ジョブ実行の履歴管理
- ジョブのフローと成功の有無
- 失敗時のタスクを再実行可能にする
- そもそものジョブの冪等性の意識