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