Django中的线程在生产中不起作用

2024-05-13 12:47:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django中有个函数视图.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”。因为这个线程需要一些时间来完成,所以我将用户重定向到另一个名为'集市:加工'. 在

我面临的问题是,它在我的本地机器上运行良好,但在生产服务器(awsec2实例)上不起作用。线程根本没有启动。在background_match函数中有一个for循环,它不会向前移动。在

但是,如果我刷新(CTRL+R)'集市:加工'页,它确实会移动1到2个迭代。因此,对于一个包含1000次迭代的完整循环,我需要刷新页面1000次。如果在100次迭代之后,我不刷新页面,它会在那一点卡住,并且不会移动到第101次迭代。请帮忙!在


Tags: djangoinstance函数pyform视图requestsave
1条回答
网友
1楼 · 发布于 2024-05-13 12:47:45

错误的架构。Django和其他web应用程序应该会产生这样的线程。正确的方法是使用任务队列创建异步任务。django最流行的任务队列恰好是Celery。在

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'))
    ...

在下一页

^{pr2}$

相关问题 更多 >