假定我的页面上的一个按钮,当单击时,该按钮将ajax请求从我的API端点发出,然后从第三方网站获取数据。假设这项任务在5秒钟的超时时间大约需要2-5秒。什么是理想的方法:
- celery task.delay((在API端点中,然后将URL返回到结果的每个X间隔。
- 只是在视图中做到
我看到的所有教程都建议使用芹菜的方式,但这似乎是很多机械/高架,用于简单的请求,并以最小的处理。是否有一些公认的阈值(直到完成等(,一个人会选择一个?
然后有Django通道似乎是理想的选择。但是,乍一看,工人和芹菜任务之间的区分线似乎模糊了。我可以用频道工人替换芹菜,然后将其用于上述任务吗?频道还可以处理我更长的运行任务吗?带有频道的优点/缺点是什么(用芹菜或更换芹菜(?
最后,3(芹菜/频道/视图(中的哪个是给出的示例场景的建议方法?
我不是频道的专家,但我们走了。
通道是WSGI上方的抽象(新协议是ASGI(,它允许您通过"抽象"通道进行通信。有时您会做http,有时会进行网络插款,有时还可以做任何其他沟通模式。
芹菜是以类似的方式构建的,它使用消息总线(有时是更复杂的经纪机制,取决于您的运行方式(,将工作发送到可以发送可选结果的工作机器。
现在您选择哪个?
在视图中
除非您有专门为此目的设计的视图,否则我会避免这种情况。您将需要确保您的堆栈可以处理长期的连接(例如,如果需要超过30秒的时间,Heroku的路由器将抱怨(,否则您将需要实现一些长的轮询接口。
芹菜
您需要进行所有设置才能使事情在线。
拥有一个任务,您想要的结果将需要结果后端并传递任务ID。
您需要实现一个可以查询芹菜的视图,以确定任务在完成,成功等方面的位置。
例如
# kick of the task somewhere
def create_task(request, *args, **kwargs):
task_id = some_task.delay(param)
return Response({'task_id': task_id})
urls.py
url(r'^/tasks/<task_id>/$', name='task-progress')
views.py
def task_progress_view(request, task_id):
# get fancier here, this is just an example
return Response(some_task.AsyncResult(task_id).state)
这是一个非常简单的例子,但这应该作为起点。
带有通道
您需要设置一辆总线,以与芹菜相同的方式将所需的视图汇总在一起,只有您仍需要有一块代码,可以将数据带有一些重试,超时逻辑等..
选择什么
芹菜将照顾工作部分,您必须照顾更新并通知客户。渠道将是处理该背部和第四的合理方法,但您可能不需要它。
我会考虑您还需要做什么。大多数应用程序在某个时候需要异步工作,因为业务逻辑通常会决定这一点。如果您打算使用WebSocket等,但是您不想将Django应用程序分解为服务,我只会咬住子弹并同时做。
如果您不需要多个通信协议,请使用芹菜并执行视图。