2017-05-23 10 views
3

Django views.pyには次のような機能があります。Djangoのスレッディングは生産中ではありません

def process(request): 
form = ProcessForm(request.POST, request.FILES) 
if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.requested_by = request.user 
    instance.save() 
    t = threading.Thread(target=utils.background_match, args=(instance,), kwargs={}) 
    t.setDaemon(True) 
    t.start() 
    return HttpResponseRedirect(reverse('mart:processing')) 

ここでは、ProcessFormがサブミットされたときに別のスレッドで関数 'background_match'を呼び出そうとしています。このスレッドは完了するまでに時間がかかるので、ユーザーを 'mart:processing'という別のページにリダイレクトします。

私が直面している問題は、ローカルマシンではすべて正常に動作しますが、AWS EC2インスタンスである運用サーバーでは機能しません。スレッドはまったく開始しません。 background_match関数の中にforループがあり、それは前進しません。

ただし、「マート:処理」ページをリフレッシュ(CTRL + R)すると、1〜2回繰り返されます。したがって、1000回の反復で構成される完全なループを実行するには、1000回のページを更新する必要があります。 100回反復した後、私はその時点でスタックしたページをリフレッシュせず、101回目の反復に移動しません。助けてください!

+0

ローカルでの生産とのrunserverにuwsgi使用していますか? – user14717

答えて

1

間違ったアーキテクチャ。 Djangoやその他のWebアプリケーションは、このようなスレッドを生成する必要があります。正しい方法は、タスクキューを使用して非同期タスクを作成することです。 djangoの最も一般的なタスクキューはCeleryです。

ページでは、非同期結果をチェックして、タスクが完了したかどうかを確認する必要があります。概略は以下の通りです。

from celery.result import AsynResult 
from myapp.tasks import my_task 

... 
if form.is_valid(): 
    ... 
    task_id = my_task() 
    request.session['task_id']=task_id 
    return HttpResponseRedirect(reverse('mart:processing')) 
    ... 
以降のページで

task_id = request.session.get('task_id') 
if task_id: 
    task = AsyncResult(task_id) 
+0

mart:processingページで非同期の結果を確認するにはどうすればよいですか? – p0712

+0

アップデートを参照してください。 – e4c5

+0

の前にこのページを読む必要があります。それが間違ったアーキテクチャの場合は、ローカルマシンで完璧に動作するのはなぜですか? – p0712

関連する問題