我可以在不启动并行进程的情况下在 Django 中运行后台进程吗?



这是一个非常幼稚的问题,但我觉得我不了解 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)

运行单独的进程在后台运行任务不是必需的,但很好且有帮助。

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

你也可以自己生成一个单独的进程 - 正如你所说 - 通过执行以下操作:

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

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

相关内容

  • 没有找到相关文章

最新更新