1

私のdjangoアプリには、実行に時間がかかる可能性のあるレポート(csvダウンロード)があります。ユーザーがレポートを実行すると、「処理」ページにリダイレクトされます。このページでは、javascript関数がサーバーを毎秒チェックして、csvが作成されているかどうかを確認します(ファイル名はHttpResponseオブジェクトに含まれています)。

私が探しているのは、csvを作成しているスレッドを識別する方法です。estimated_time_to_completionそうすれば、スレッドに属性を追加して、この情報を保留ページに含めることができます。実際、(ロック解除された)csvの存在を確認するのをやめることができました。スレッドが終了したかどうかを尋ねることができました。

私のcsv作成スレッドは次のようになります-

class CsvBuilder(threading.Thread):

    def __init__(self, file_name, parameters)
        self.file_name = file_name
        self.parameters = parameters
        threading.Thread.__init__(self)

    def run():
        # ...
        file = open(self.file_name, 'wb')
        writer = csv.writer(file)
        for patient in patients:
            writer.writerow('some data')
            self.time_remaining = # a timedelta object
        file.close()

そして、私のdjangoリクエストは次のようになります-

def create_csv(request):
    '''
    Standard django view to create a csv
    '''
    # get filename and parameters from request
    thread = CsvBuilder (file_name, parameters)
    return render_to_response('processing.html', {"thread_id": thread.thread_id})

def check_progress(request):
    '''
    An ajax call to check the progress on a report
    '''
    thread_id = requst.GET['thread_id']
    # find the thread 
    return HttpResponse(thread.time_remaining)

これは可能ですか?それとも私はこれを別の方法で行うべきですか?

4

2 に答える 2

4

専用のバックグラウンドタスクライブラリを使用するのがおそらく最も簡単で安全です。これらはこのようなユースケース向けに設計されています。Pythonで最も一般的なのはCeleryです。優れたDjangoサポートがあり、非常に使いやすいです。

于 2012-07-11T10:56:05.523 に答える
1

ライター関数で、time_remaining計算用にmemcachedキー/値を更新することをお勧めします。

私だったら、おそらく長期的な仕事にCeleryを使用していたでしょう。djangoからスレッドを開始すると、落とし穴があるように見えますが、具体的なことは何も思い浮かびません。

于 2012-07-11T10:57:16.113 に答える