假设我的页面上有一个按钮,当单击该按钮时,会向我的api端点发出ajax请求,然后从第三方站点获取数据。假设这个任务大约需要2-5秒,超时时间为5秒。最理想的方法是什么?
我所见过的所有教程都提出了芹菜的方法,但对于处理最少的简单请求来说,这似乎是一种很大的机械/开销。是否存在一些普遍接受的阈值(秒直到完成,等等)哪一个人会选择一个而另一个?
然后是django频道,这似乎是理想的选择。但是,乍一看,区分渠道工人和芹菜任务的界限似乎模糊了。我是否可以用渠道工人来代替芹菜,用它来完成上述的任务?频道也会处理我运行时间较长的任务吗?渠道(芹菜或代替芹菜)的优点/缺点是什么?
最后,3种(芹菜/频道/观景)中的哪一种将是推荐的示例场景的方法?
发布于 2017-06-05 20:50:06
我不是渠道方面的专家,但我们开始了。
通道是WSGI之上的抽象(新协议是ASGI),它允许您通过“抽象”通道进行通信。有时候你会做HTTP,有时是websockets,有时你可以做很多其他的事情--你几乎可以做任何一种通信模式。
芹菜是以类似的方式构造的,它使用消息总线(有时是一种更复杂的代理机制,取决于您如何运行它)将工作发送到可以返回可选结果的工作机器。
现在你选择哪一个?
在视野中
除非您有专门为此目的设计的视图,否则我将避免这种情况。您需要确保您的堆栈能够处理长时间的连接(例如,heroku的路由器会抱怨超过30秒),或者您希望实现一些长轮询接口。
芹菜
你需要做所有的设置才能让事情在线。
有一个任务,其结果需要一个结果后端,并在周围传递任务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)这是一个非常简单的例子,但这应该作为一个起点。
有通道
您将需要设置一个总线,以与芹菜相同的方式将所需的视图组合在一起,只是您仍然需要一段代码,它可以用重试、超时逻辑等来获取数据。
选择什么?
芹菜将负责工作部分,你将不得不负责更新和通知你的客户。渠道将是一个合理的方式来处理这回和第四,但你可能不需要它。
我会考虑你还需要做什么。大多数应用程序在某一时刻都需要异步工作,因为业务逻辑常常要求异步工作。如果您计划使用websockets之类的,但您不想将django应用程序分解为服务,我就会咬紧牙关,两者兼而有之。
如果您不需要一个以上的通信协议,只需使用芹菜和做视图。
https://stackoverflow.com/questions/44374212
复制相似问题