2013-12-13 35 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