2012-07-24 100 views
2

是否有可能做这样的事情:异步功能查看

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分钟),并且我希望它是一场火灾,并且从用户的角度来看就是忘记了。

回答

4

您可以随时把火关线程:

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

+0

你会推荐这个或像芹菜更强大的任务排队应用程序?我想每个人都有自己的优点和缺点,但我不确定是坚持简单的python线程还是使用芹菜。 – leonsas 2012-07-24 16:15:54

+0

我认为这一个简单的任务对于芹菜来说是过分的。如果你正在做很多这些东西以及需要监控的更复杂的任务,那么,是的,Celery是你应该转向的地方。 – 2012-07-24 16:27:46

2

简单的答案,没有。

在继续执行之前,您的函数将一直持续到序列化完成。

看看django-celery的任务排队解决方案。

+0

如果它可以更容易,有是没有数据从函数返回,所以它更像是一个事件。 – Jharwood 2012-07-24 14:35:15

+0

它不会这样工作,你的函数必须在继续之前完成 – 2012-07-24 14:42:08