我能否在Django中运行后台进程而无需启动并行进程?

3
这是一个非常幼稚的问题,但我觉得我不理解django和python中异步/后台任务的一些基本概念。我尝试复制django-background-tasks提供的简单示例(https://github.com/collinmutembei/django-background-tasks-example),以便使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)

我尝试在我的代码中运行后台进程任务。它可以正常工作,但是间隔时间不起作用。我尝试参考了许多文档,但是没有得到答案。请您看一下这个链接 https://stackoverflow.com/questions/60427397/how-to-run-background-process-code-using-django 。 - hari prasanth
1个回答

8

运行单独的进程来后台执行任务不是必需的,但是可以提高效率和方便。

当你运行服务器时,会创建一个进程 - 运行 ps aux | grep runserver - 该进程负责处理web请求。当你想要在后台运行某些任务时,这意味着你需要一个单独的进程来执行这些任务。这就是异步任务工具(如celery)发挥作用的地方。

你也可以像你所说的那样自己生成一个单独的进程:

import subprocess

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

如果你只有一两个小任务需要并行运行,那么这种方法也完全可以。然而,当你在后台运行大量复杂的任务时,你需要妥善管理它们。此外,如果出现问题,你需要能够调试这些任务。之后,你需要更多地了解所有后台任务正在发生的事情、它们的状态等。这就是celery的用处所在。它会给你带来装饰方法,这些方法将为你处理所有这些事情。你只需关心你的业务逻辑即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接