スキップしてメイン コンテンツに移動

投稿

4月, 2011の投稿を表示しています

[Python][Google App Engine]db.Modelのput/getで勝手にmemcacheを使うよう拡張してみた

GAEを使う必ずみんな意識するのがDataStoreへのアクセスをいかに減らすか。 それすなわちキャッシュの使い方なり! と考えているわけですが、やることなんて以下の2点だと思います。 ・Model.put()するときにはmemcache.set()しろ ・Model.get()するまえにmemcache.get()しろ そこで、db.Modelを拡張しました。 まず、ModelAbsというdb.Modelを継承した中間のクラスを作って。 ========== class ModelAbs(db.Model):     def put_with_cache(self,key_name):         self.put()         memcache.set(key=key_name,value=self)         return self.key()     @classmethod     def get_with_cache(cls,key_names,**kwargs):         if isinstance(key_names,list) == False:             key_names = [str(key_names)]         models = list()         for key_name in key_names:             ent = memcache.get(key=key_name)             if ent == None:                 ent = cls.get_by_key_name(key_names=key_name)                 memcache.set(key=key_name,value=ent)             models.append(ent)         if len(key_names) > 1:             return models         else:             return models[0] ========== そのModelAbsを継承したエンティティのクラスを作りました。 ========== class SPOTS(Mod

[Python][Google App Engine]Taskqueue.add()からのTaskqueue.add()-確認編-

以前POSTした 仮説 の確認編。 結論から言って、出来ました。 Taskqueue.add()した先の処理でさらにTaskqueue.add()した場合でも同じように非同期起動は可能でした。 バッチ処理の連携が可能になるわけですねー。 今の使い方は、こんな感じ。 cronでレート取得処理を起動 Taskqueue.add()でレート保存処理を起動 Taskqueue.add()でシグナル判定処理を起動 シグナル判定処理が1通貨ペアあたり複数あるので、シグナルごとにQueueを分けて実行しようと考えています。

[Python][Google App Engine]Taskqueue.add()からのTaskqueue.add()-仮説編-

非同期処理から非同期処理を起動したい。 なんてことがあるかどうかは知らないけど、気になってしまった。。。 データストアへのアクセスは遅いので、出来る限りTaskqueue.add()で非同期に寄せたい さらに並列処理もTaskqueue.add()で非同期に寄せたい この2点を満たそうとしてこんな構造にしてしまった。 cronからTaskqueue.add()で非同期処理を起動 DataStoreから後続の並列処理で共通で使うデータを取得 1段目の非同期処理で取得したデータを付加してTaskqueue.add()で後続の非同期処理を起動 雰囲気的にはできそう。考慮しなければいけない制約はこんな感じか。 リクエストのサイズに上限があるので、1段目の非同期処理から並列処理に全てのデータが渡せるか 処理するリクエストが増えて処理全体のオーバーヘッドが大きくなる 試してまた書きたい。

[Python][Google App Engine]Taskqueue.add()でTransientError

エラー対応メモ。 レート取得の飛び軽減対応を実施したあと昨日から運用していたレート取得で下記Errorがでた。 ========== "/base/python_runtime/python_lib/versions/1/google/appengine/api/taskqueue/taskqueue.py", line 1106, in __AddTasks     raise self.__TranslateError(e.application_error, e.error_detail) TransientError ========== 見るとどうやらTaskqueue.add()で出ているようだ。 リトライを書いたので、メモ。 count = 0 while True: try: taskqueue.add(queue_name='',url='',params={'':,'':,'':,'':,'':}) except TransientError: count += 1 if count <= 10: time.sleep(0.5) raise else: break 簡単だけどTransientErrorを拾って、10回までリトライ。 リトライ間隔は0.5秒。 この処理追加に当たってimport行の追加は以下。 import time from google.appengine.api.taskqueue.taskqueue import TransientError 以上です。