django での長い計算に問題があります。私の会社の愚かさのためにCeleryをインストールすることができないので、「車輪を再発明する」必要があります.
すべての計算を辞書の「結果」に格納する TaskQueue クラスですべての計算を実行しようとしています。また、提供されたキーを持つタスクの準備ができているかどうかをこの TaskQueue に尋ねる「お待ちください」ページを作成しようとしています。
そして問題は、結果がどういうわけか消えてしまうことです。
私は長い計算でいくつかの見解を持っています。
def some_view(request):
...
uuid = task_queue.add_task(method_name, params) #method_name(params) returns HttpResponse
return redirect('/please_wait/?uuid={0}'.format(uuid))
そしてplease_waitビュー:
def please_wait(request):
uuid = request.GET.get('uuid','0')
ready = task_queue.task_ready(uuid)
if ready:
return task_queue.task_result(uuid)
elif ready == None:
return render_to_response('admin/please_wait.html',{'not_found':True})
else:
return render_to_response('admin/please_wait.html',{'not_found':False})
そして最後のコード、私の TaskQueue:
class TaskQueue:
def __init__(self):
self.pool = ThreadPool()
self.results = {}
self.lock = Lock()
def add_task(self, method, params):
self.lock.acquire()
new_uuid = self.generate_new_uuid()
while self.results.has_key(new_uuid):
new_uuid = self.generate_new_uuid()
self.results[new_uuid] = self.pool.apply_async(func=method, args=params)
self.lock.release()
return new_uuid
def generate_new_uuid(self):
return uuid.uuid1().hex[0:8]
def task_ready(self, task_id):
if self.results.has_key(task_id):
return self.results[task_id].ready()
else:
return None
def task_result(self, task_id):
if self.task_ready(task_id):
return self.results[task_id].get()
else:
return None
global task_queue = TaskQueue()
タスクの追加後、数秒間 uuid を指定して結果をログに記録できますが、タスクの準備ができていないと表示されます。ここに私のログがあります: (私は task_queue.results を出力しています)
[INFO] 2013-10-01 16:04:52,782 logger: {'ade5d154': <multiprocessing.pool.ApplyResult object at 0x1989906c>}
[INFO] 2013-10-01 16:05:05,740 logger: {}
お願い助けて!なぜ地獄の結果が消えるのですか?
UPD : @freakish は、いくつかの新しい情報を見つけるのに役立ちました。この結果は永久に消えるわけではありません。ログを記録しようとすると、時々消えます。
[INFO] 2013-10-01 16:52:41,743 logger: {}
[INFO] 2013-10-01 16:52:45,775 logger: {}
[INFO] 2013-10-01 16:52:48,855 logger: {'ade5d154': <multiprocessing.pool.ApplyResult object at 0x1989906c>}