2012-07-24 2 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

당신은 항상 스레드를 해고 할 수도

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

참조 :이 http://docs.python.org/library/threading.html

+0

Celery와 같은 이보다 안정적인 작업 대기열 응용 프로그램을 권장 하시겠습니까? 나는 각자 자신의 장단점을 가지고 있다고 생각하지만 간단한 파이썬 스레드에 붙이거나 샐러리와 함께 간다면 확실치 않습니다. – leonsas

+0

나는이 간단한 작업이 셀러리에 과잉이라고 생각한다. 모니터링을 필요로하는 이러한 작업과 복잡한 작업을 많이 수행했다면 셀러리가 돌아 가야합니다. –

2

간단한 대답, 아니오.

실행을 계속하기 전에 직렬화가 완료 될 때까지 함수가 실행됩니다.

작업 큐잉 솔루션에 대해 django-celery을보십시오. 그런 다음

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을 대체 :

+0

그것은 쉽게 경우, 함수에서 반환 할 데이터가 없으므로 이벤트와 비슷합니다. – Jharwood

+0

계속 작동하기 전에 함수가 완료되어야합니다. –