2013-12-13 70 views
0

我想在TemplateView中使用concurrent.futures異步執行某些工作單元。然而,我遇到了我的異步代碼沒有被調用的問題。我在這裏做錯了什麼?這是一個示例代碼,它只是乘以一個數字,但實際上我想要異步地複製背景中的某些文件。任何幫助是極大的讚賞!django在TamplateView問題中使用期貨

import concurrent.futures 
import time 

class AsyncTest(TemplateView): 
    def get(self, request, *args, **kwargs): 
     op = kwargs.get('op') 

     if op == 'asynch': 
      print 'using futures async' 
      executor = concurrent.futures.ThreadPoolExecutor(max_workers=1) 
      # I see this print message 
      print 'executing future 1 time' 
      executor.map(self.load, 10) 
      return render(request, 'text.html', {'lines':'Performing async processing!', 'op':op}) 
     else: 
      return HttpResponseBadRequest("Operation not implemented at this time (op=%s)" % op) 

    def load(x): 
     #I never see this get invoked 
     print 'in load...sleep' 
     time.sleep(2) 
     print 'sqr x*x=%s of x=%s' %((x*x), x) 
     return x*x 

我從來沒有看到任何從服務器的負載方法印刷,只是頁面呈現印有最後一件事:「執行未來1周時間」

回答

0

我放棄了嘗試做做非阻塞因爲看起來是不可能的,所以使用併發處理。我結束了切換到django芹菜做我的異步處理。

0

你怎麼沒有更努力,這是一個好主意!當我看着是否有人用django嘗試過期貨時,我就陷入了這個問題。

我不得不修復你的例子來嘗試它:executor.map返回一個迭代器,直到你實際迭代它纔會被執行。其第二個參數必須是可迭代的,如列表。這裏可以做的是將返回的迭代器傳遞給模板,並有一個for循環來實際呈現結果。

現在,芹菜是與django去處理並行處理的方式,所以我同意你的第二選擇。另一方面,futures更專注於它的語法看起來更適合那種特定的情況。

另外,我建議另一種方法,那就是我通常在頁面中做的有點慢,因爲它們彙總了來自多個來源的信息:讓視圖返回一個可能顯示最有用信息的skeletton模板,然後使用JavaScript加載缺少的部分,從其他視圖加載。像jQuery這樣的經典框架將有助於以一種必要的方式來實現這一點,但是angularjs確實值得檢查它的聲明式方法。

+0

感謝您的有見地的評論文森特。我實際上最終使用了django-芹菜和期貨。我將芹菜用於異步處理邏輯,然後使用Future:ThreadPoolExecutor同時將多個文件加載到HDFS中。我來自Java世界,所以python對我來說是新的,所以放棄早期可能只是沮喪,無論如何,我開始越來越多地挖掘python。 – Marcin