我可以在Django中运行后台进程而无需启动并行进程吗?

时间:2017-05-25 04:17:47

标签: python django parallel-processing celery

这是一个非常天真的问题,但我觉得我不了解django和python中异步/后台任务的基本内容。

我尝试复制django-background-tasks(```math blocks)提供的一个简单示例,以使django比实际运行晚60秒执行后台任务。但我猜这同样适用于任何其他后台任务管理器,如Celery或Huey

示例非常简单 - 只要用户访问url,就会执行一个打印消息的简单函数,而不会阻止主django进程,60秒后

  from background_task import background
  from logging import getLogger

  logger = getLogger(__name__)

  @background(schedule=60)
  def demo_task(message):
      logger.debug('demo_task. message={0}'.format(message))

问题在于我真的不了解基础知识。除非我启动单独的(或分离的)进程python manage.py process_tasks,否则它不会运行。我应该总是这样做以使后台任务工作,或者有一种方法可以在不启动并行过程的情况下完成它吗?

如果我应该开始并行处理,我可以从django代码中进行。类似的东西:

    import subprocess

    process = subprocess.Popen(['python', 'manage.py','process_tasks'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

2 个答案:

答案 0 :(得分:2)

运行单独的流程以在后台运行任务是没有必要的,但是很有帮助。

运行服务器时,会创建一个进程 - 运行ps aux | grep runserver - 负责提供Web请求。当您说要在后台运行某些任务时,它隐含意味着您需要一个单独的进程来执行这些任务。这就是像芹菜这样的异步任务工具的用武之地。

你也可以自己产生一个单独的过程 - 如你所说 - 做:

import subprocess

process = subprocess.Popen(['python', 'manage.py','process_tasks'], stdout=subprocess.PIPE, stderr=subprocess.PIPE

如果您只想要并行运行一个或两个小任务,这个方法也完全没问题。但是,当您在后台运行大量复杂任务时,您可能希望正确管理它们。此外,如果出现问题,您需要能够调试这些任务。之后,您将需要更多地了解所有后台任务,状态等方面的情况。芹菜将帮助您。它将为您提供装饰方法,为您处理所有这些事情。您只需担心您的业务逻辑

答案 1 :(得分:1)

在Django中运行异步任务可以使用Celery与RabbitMQ或Redis等消息代理一起完成。本文可能会为您提供有关如何实现它的一些见解Asynchronous tasks in Django