【问题标题】:Django with python ayncio to perform background taskDjango 与 python ayncio 执行后台任务
【发布时间】:2019-03-29 04:32:48
【问题描述】:

我有两台服务器,一台提供 REST API 以接受来自用户的数据并维护产品详细信息列表的主服务器。此服务器还负责在产品更新/创建后立即与辅助服务器共享产品列表(产品数据的子集)。 另请注意,辅助 url 取决于产品详细信息,而不是修复服务器。

用 Django 编写的主服务器。我使用 django model db 信号作为产品更新、创建和删除事件。 现在的问题是我不想阻塞我的主服务器 REST 调用,直到它将详细信息填充到辅助服务器。我需要一些调度程序的东西来做到这一点,即创建一个任务来在后台填充数据而不阻塞我当前的线程。

我发现python asyncio模块带有一个函数'run_in_executor',它一直工作到现在,但是我不知道在wsgi服务器中运行django的副作用,谁能解释一下?或任何其他替代品?

我找到了 django 频道,但它需要额外的东西,比如单独运行工作线程,redis 缓存。

【问题讨论】:

  • 不要在 Django 等 WSGI 应用程序中运行后台任务。使用像 Celery 这样的任务队列。
  • 我的应用在 azure 中部署为 webapp,无法运行多个进程。并尽量避免redis缓存
  • 假设您是一名驾驶教练,而您的学生说“我尽量避免使用方向盘。”。你会怎么回答?
  • 这是一个不错的选择,但我要求提供一个我正在开车的情况,并要求提供自动驾驶功能,以便我可以吃完我的食物

标签: python django python-asyncio


【解决方案1】:

您应该使用 Django Celery 异步或在后台运行任务。

Celery 是一个包含电池的任务队列。它易于使用,因此您无需了解它所解决问题的全部复杂性即可开始使用。

您可以从http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#first-steps获取更多关于芹菜的信息

【讨论】:

  • 我的应用在 azure 中部署为 webapp,无法运行多个进程。并尽量避免redis缓存
  • 您可以使用 Azure 提供的独立 redis 缓存,即 Azure 缓存。从azure.microsoft.com/en-in/services/cache获取更多详细信息
  • 我只能对成本和部署依赖性产生副作用。任何替代想法,例如在 django app ready() 中打开一个单独的线程。并在这个线程内运行一个事件循环。但同样我对副作用一无所知。虽然这也有效。
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多