1

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>}
4

1 に答える 1