【问题标题】:Async functions in Django viewsDjango 视图中的异步函数
【发布时间】:2020-07-23 09:03:26
【问题描述】:

是否可以这样做:

def new_query(request,company_uuid,address_uuid,contact_uuid):
    mcompany = get_object_or_404(Company, uuid=company_uuid)
    if request.method == 'POST': # If the form has been submitted...
        form = forms.CompanyQueryForm(request.POST)
        if form.is_valid():
            mquery = form.save(commit = False)
            mcompany = get_object_or_404(Company, uuid = company_uuid)
            mquery.company = mcompany
            mquery.version_number = 1
            mquery.parameters = {
                                    'company':company_uuid,
                                    'address':address_uuid,
                                    'contact':contact_uuid
                                    }
            mquery.save()
            preserialise(mquery.pk, company_uuid)
            recent_update = RecentUpdate(company_query=mquery, update_type="1")
            recent_update.save()
            url = reverse('view_directory',kwargs={'company_uuid':company_uuid,
                                                                'address_uuid':address_uuid,
                                                                'contact_uuid':contact_uuid})
            return HttpResponseRedirect(url)
    else:
        form = forms.CompanyQueryForm()
    return share.output_page(request,'joinerysoft/new_query.html',{'title':unicode(u'New Company Query'),
                                                                   'form': form,
                                                                   'company':mcompany,
                                                                   'address_uuid':address_uuid,
                                                                   'contact_uuid':contact_uuid})   

preserialise(mquery.pk, company_uuid) 在后台运行而不等待返回?因为预序列化需要很长时间才能完成(超过 5 分钟),从用户的角度来看,我希望它是一场大火并忘记。

【问题讨论】:

    标签: python django asynchronous django-views


    【解决方案1】:

    你总是可以触发一个线程:

    import threading
    
    class PreserializeThread(threading.Thread):
        def __init__(self, mquery_pk, company_uuid, *args, **kwargs):
            self.mquery_pk = mquery_pk
            self.company_uuid = company_uuid
            super(PreserializeThread, self).__init__(*args, **kwargs)
    
        def run(self):
            preserialize(self.mquery_pk, self.company_uuid)
    

    然后,将代码示例中的 preserialize 替换为:

    PreserializeThread(mquery.pk, company_uuid).start()
    

    另请参阅:http://docs.python.org/library/threading.html

    【讨论】:

    • 你会推荐这个还是像 Celery 这样更强大的任务队列应用程序?我想每个人都有自己的优点和缺点,但我不确定是坚持简单的 python 线程还是使用 celery。
    • 我认为这一项简单的任务对 Celery 来说太过分了。如果你正在做很多这样的事情和需要监控的更复杂的任务,那么,是的,Celery 是你应该转向的地方。
    【解决方案2】:

    简单的回答,不。

    您的函数将在序列化完成后继续执行。

    查看django-celery 以获得任务队列解决方案。

    截至 2020 年,celery 现在支持开箱即用的 Django。

    【讨论】:

    • 如果它更容易,没有数据可以从函数返回,所以它更像是一个事件..
    • 这样不行,你的函数必须完成才能继续
    • 异步支持有什么改变吗? docs.djangoproject.com/en/3.0/topics/async
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2023-03-25
    • 2022-12-05
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多