2011-07-20 35 views
0

私はdjangoプロジェクトで作業しています。ここで、バックエンドで処理する必要がある画像の束を送ります。メインスレッドがDjangoを使用して終了した後でもスレッドが実行されています

イメージはすでにサーバーにアップロードされていますが、ユーザーが送信を要求すると、リクエストを処理するのに多くの時間がかかり、「お使いいただきありがとうございました」というメッセージが表示されるまで約15秒かかります。

私がやりたかったのは、時間のかかるプロセスの一部を別のスレッドに入れて、すぐに感謝のメッセージを表示することでした。私はそれを実行した後、しかし

def processJob(request): 
    ... 
    threading.Thread(target=processInBackground, args=(username, jobID)).start() 
context = {} 
context.update(csrf(request)) 
return render_to_response('checkout.html', context) 

def processInBackground(username, jobID): 
... 
    (processing the rest of the job) 

:私のコードは次のようになりますこれは、新しいスレッドを作成しますが、それは、メインスレッドが終了秒で終了します。ユーザーが感謝のメッセージをすぐに受け取っている間に、私はどのようにバックエンドのものを処理することができますか?

+0

"プロセスの時間がかかり、別のスレッドに移行する"常に間違ったアプローチ。あなたはスレッドを望んでいません。あなたはプロセスが必要です。 –

+0

いいえ、Djangoだけで行う方法はありません。 [celery](http://celeryproject.org/)[追加情報付きブログ記事](http://www.turnkeylinux.org/blog/django-celery-rabbitmq) –

答えて

0
PROCESSORS = [] # empty list of background processors 

継承Trheading.threadから

その後
class ImgProcessor(threading.Thread): 
    def __init__(self, img, username, jobID): 
     self.img = img 
     self.username = username 
     self.jobID = jobID 
     threading.Thread.__init__(self) 
     self.start() 
     self.readyflag = False 

    def run(self): 
     ... process the image ... 
     self.readyflag = True 

、リクエスト受信時:

def processJob(request): 
    PROCESSORS.append(ImgProcessor(img, username, jobID)) 
    .... remove all objects in PROCESSORS that have readyflag == True 
0

これは、あなたが探しているものは必ずしもありませんが、私のカメラマンのウェブサイトとのプラットフォームでは、Javascript(PLUploadを使用)を使用して写真を非同期でアップロードしています。これにより、一度に複数の写真のアップロードステータスをコールバックできるようになります。ひとたびアップロードされると、ファイルは一意の名前を持つフォルダに保存され、データベースキューに保存され、キューで実行されてまだ完了していないものについて実行されたcronジョブによってピックアップされ、処理されます。私はDjangoのカスタム管理コマンドを使用しているので、Web部分を除いたDjangoフレームワークのすべての利点が得られます。

アップロードのすべての記録を取得し、ポーリングリクエストでステータスを表示し、必要に応じて任意のサーバーで処理を実行できます。

関連する問題