我的Django views.py中有一个类似这样的函数。
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)“ mart:processing”页面,它会移动1或2次迭代。因此,要运行一个包含1000个迭代的完整循环,我需要刷新页面1000次。例如,如果经过100次迭代,我不刷新页面,则该页面将停留在该位置,并且不会移至第101次迭代。请帮忙!
错误的架构。Django和其他网络应用程序应生成此类线程。正确的方法是使用任务队列创建异步任务。django最受欢迎的任务队列恰巧是Celery。
然后mart:processing页面应检查异步结果,以确定任务是否已完成。粗略的草图如下。
mart:processing
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)