我可以 运行 Django 中的后台进程而不启动并行进程吗?
Can I run a background process in Django without starting a parallel process?
这是一个非常幼稚的问题,但我觉得我不了解 django 和 python 中有关 asynchronous/background 任务的一些基本知识。
我尝试复制 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
- 负责处理网络请求。当你说你想在后台执行 运行 某些任务时,它隐含地意味着你想要一个单独的进程来执行这些任务。这就是 celery 等异步任务工具的用武之地。
您也可以自己生成一个单独的进程 - 如您所说 - 通过执行以下操作:
import subprocess
process = subprocess.Popen(['python', 'manage.py','process_tasks'], stdout=subprocess.PIPE, stderr=subprocess.PIPE
如果您只想 运行 并行执行一两个小任务,则此方法也完全没问题。但是,当您在后台处理大量复杂任务时 运行,您可能希望妥善管理它们。此外,如果出现问题,您还需要能够调试这些任务。稍后,您将需要更多地了解所有后台任务中发生的事情、它们的状态等。这就是 celery 可以帮助您的地方。它会给你装饰的方法来为你处理所有这些事情。然后你只需要担心你的业务逻辑
这是一个非常幼稚的问题,但我觉得我不了解 django 和 python 中有关 asynchronous/background 任务的一些基本知识。
我尝试复制 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
- 负责处理网络请求。当你说你想在后台执行 运行 某些任务时,它隐含地意味着你想要一个单独的进程来执行这些任务。这就是 celery 等异步任务工具的用武之地。
您也可以自己生成一个单独的进程 - 如您所说 - 通过执行以下操作:
import subprocess
process = subprocess.Popen(['python', 'manage.py','process_tasks'], stdout=subprocess.PIPE, stderr=subprocess.PIPE
如果您只想 运行 并行执行一两个小任务,则此方法也完全没问题。但是,当您在后台处理大量复杂任务时 运行,您可能希望妥善管理它们。此外,如果出现问题,您还需要能够调试这些任务。稍后,您将需要更多地了解所有后台任务中发生的事情、它们的状态等。这就是 celery 可以帮助您的地方。它会给你装饰的方法来为你处理所有这些事情。然后你只需要担心你的业务逻辑