celeryでsingletonなタスク
djangoでバッチ処理や非同期処理を組もうとしてceleryを導入。使い方も簡単でとても便利。
が、多重起動されたら困る処理を制限しようとしても、celery自体にはそういう機能がない模様。celeryのcookbookをみると、celery.task.Taskを継承したクラスを自分で作ればいいらしい。でもいちいちclassを定義するのは面倒。
というわけでdecoratorでsingletonなタスクを実現できるようにしてみた。
続きを読む…
ファイルアップロード処理でtempfileを使う
ファイルアップロードをする際にposterを使っています。とても便利なのですが、実体ファイルを構築して、posterに食わせて、ファイル削除、という手順が面倒だったので、tempfileを使ってみました。
# make temporary file
temp = tempfile.TemporaryFile()
temp.write(simplejson.dumps({
"seq": 1,
"abc": 123,
"def": "ASD"
}))
temp.write("\n")
temp.write(simplejson.dumps({
"seq": 2,
"abc": 123,
"def": "ASD"
}))
temp.write("\n")
temp.write(simplejson.dumps({
"seq": 3,
"abc": 123,
"def": "ASD"
}))
temp.flush()
temp.seek(0)
# encoding
datagen, headers = multipart_encode({
"args": "other parameter",
"datas": temp
})
# create request
request = urllib2.Request("http://localhost:8000/fileupload/", datagen, headers)
# do post !
response = urllib2.urlopen(request)
これで少なくともファイルの後始末は気にしなくてよいので便利。ちなみにSpooledTemporaryFileだとうまくいかない。rollover()すればイケるかもしれないけど未検証。
pythonのissubclassでハマる
最近djangoでWebシステムを作るお仕事しています。python、djangoはなかなかよく出来ていてハマるところが少ないのですが、うっかり軽くハマったのでメモ。
あるクラスがあるクラスを継承しているかどうかをチェックするためには組み込み関数のissubclass()を使いますが、継承元が抽象クラスだとissubclass()はFalseを返してくるらしい。
続きを読む…