在django视图中替换time.sleep for while循环

时间:2016-05-30 07:50:15

标签: python django celery

以下是我想在django视图中做的事情。

import requests, time
def SOME_VIEW_FOR_AJAX(request):
    if request.is_ajax():
        response = requests.get('API_URL_START_TASK')
        # response is like {'ready':false, 'status':'PENDING'}
        while not response['ready']:
            response = requests.get('API_URL_CHECK_TASK')
            time.sleep(1)
        result = response.get()
        # SOME MORE WORKS ...

通过api(celery在另一台PC上),此视图启动芹菜任务,不断检查任务的状态,并在任务完成时获得结果。

我在这里关注time.sleep的存在。 This SO POST表示使用time.sleep是不合适的,因为它包含当前线程。使用django视图是否可能替换time.sleep?或者是否允许time.sleep用于此类用途?

我使用的是Django 1.8.6,Apache 2.4和mod_wsgi,Windows Server 2012 R2。提前谢谢。

2 个答案:

答案 0 :(得分:1)

这是错误的做法。 Celery的重点是卸载长时间运行的任务,这样他们就不会延迟响应。

相反,你应该立即返回一个持有响应,然后通过Ajax获得你的前端 - 定期请求状态,可能来自另一个视图。

答案 1 :(得分:-1)

在答案和评论之后,谢天谢地,我留下了一些记录供以后使用。

正如丹尼尔的回答所说,芹菜的使用不是在服务器的某些计算过程中等待。因此,前端投掷和检查芹菜任务是很自然的。

并且javascript中的url暴露不是安全问题。根据{{​​3}}和This SO post,我可以将api url视为单个网页的网址,这是公知的,并且许多请求不会给服务器带来负担。

在我分别用于主Web服务和计算的两个服务器分开的情况下,应该配置CORS头。 that指出,当您为与主机不同的域调用ajax时,jQuery不会设置适当的标头,以致request.is_ajax()不起作用。 ajax代码中的crossDomain: false将解决此问题。

我仍在搜索并查明服务器端的安全性......正如keni所说,This SO post可能有所帮助。

我想我的问题并没有很好地总结我的担忧,所以我想在这里做。欢迎任何提示。