【问题标题】:How to activate the process queue in "django-background-tasks"如何在“django-background-tasks”中激活进程队列
【发布时间】:2017-05-03 12:03:24
【问题描述】:

我是 Django 和 django-background-tasks 包的新手。

我面临一个问题,除非我强制运行命令 process_tasks,即 python manage.py process_tasks,否则我无法执行/启动后台任务。我想在不运行process_tasks 命令的情况下执行/启动后台任务。

settings.py

MAX_ATTEMPTS=1
BACKGROUND_TASK_RUN_ASYNC = True

tasks.py

from background_task import background
#included necessary packages for SMTP
@background(schedule=5)
def test():
    #send mail to some ids

views.py

def index(request):
    test(schedule=5)
    return HttpResponse("Hello, world. ")

忽略我的逻辑。

【问题讨论】:

    标签: django multithreading python-2.7 background-task


    【解决方案1】:

    您必须运行process_tasks 命令才能执行已安排好的任务。没有其他办法。 Process_tasks 定期检查数据库中的计划任务并在后台执行。

    在本地环境中

    打开终端,cd 进入您的应用文件夹并启动命令python manage.py process_tasks。如果您使用的是 virtualenv,请确保先激活它。

    在生产环境中

    选项 1:运行 cron 作业

    一种解决方案是使用cron job 启动process_tasks 命令。请注意,cron 会在预定的时间间隔启动一个新进程,而不关心以前的进程。您必须确保进程在安排新的 cron 调用时结束。否则,您将在 process_tasks 的并行实例上浪费资源。幸运的是,这项检查很容易做到。

    要在有限的时间内启动process_tasks,您可以使用其duration 参数。例如,要以 10 小时的生命周期启动它,您可以调用:

    python manage.py process_tasks --duration 36000   
    

    配置 cron 作业:cPanel 中,您可以使用 Cron Jobs 应用程序。将 cron 作业配置为每小时运行一次,并将以下行添加为您的 cron 命令:

    cd /home/username/appname && /home/username/virtualenv/bin/python /home/username/appname/manage.py process_tasks --duration 3540 
    

    这将 cd 进入您的应用文件夹并启动 process_tasks 命令,同时考虑到您的虚拟环境并为 process_tasks 命令使用 59 分钟的生命周期。

    相应地更新您的应用程序和虚拟环境的路径!调整 cron 作业间隔和 duration 参数以满足您的需求!

    好处:

    • 如果命令失败,稍后将由 cron 作业重新启动。
    • 您不必过多担心资源/内存泄漏。

    选项 2. 在服务器启动时启动命令

    基本上,您必须创建一个包含相同启动命令的脚本文件,并将您的服务器配置为在启动时运行它。

    您失去了进程不时重新启动的好处,因此您可能必须监控其运行状况。如果您要走这条路,一个好方法是使用supervisord 来监控您的流程。

    【讨论】:

      【解决方案2】:

      python manage.py process_tasks &

      gunicorn --workers=3 app.wsgi -b 0.0.0.0:8080

      【讨论】:

        【解决方案3】:

        如果其他人试图让这个工作 - 我从我的 Dockerfile 调用一个 shell 脚本,然后运行两个命令。一个用于启动网络服务器(gunicorn 或 run_server),另一个用于运行 manage.py process_tasks 进程。重要的是将 process_tasks 进程作为后台任务运行。

        在我的 Dockerfile 的底部,我有: CMD ["./run_app.sh"]

        我的 run_app.sh 文件看起来像:

        #!/usr/bin/env bash
        
        # start background tasks 
        python manage.py process_tasks &
        
        gunicorn --workers=3 app.wsgi -b 0.0.0.0:8080
        

        注意进程任务命令中的尾随 &。这使 shell 脚本能够继续处理并运行 gunicorn 命令。

        希望这对某人有所帮助。

        【讨论】:

          【解决方案4】:

          我也在尝试使用 Django 后台任务,并且已经成功完成了所有操作,并且我的任务在手动运行“python manage.py process_tasks”时完美执行,但是我的后台任务不会按照@background(schedule=60) 自动触发运行“python manage.py process_tasks”或任何我设置的计划时间。比为任务设置计划时间的意义何在。当必须使用命令 python manage.py process_task 执行任务时,必须触发所有后台任务。

          【讨论】:

          • 你有没有找到自动运行它的方法
          【解决方案5】:

          您可以使用以下代码直接在 django 项目中调用 manage.py 命令:

          from django.core.management import call_command
          
          call_command('process_tasks')
          

          查看文档here

          【讨论】:

          • 在这种情况下不起作用。你会得到 django.core.management.base.CommandError: Unknown command
          【解决方案6】:

          你可以制作一个 bash 脚本来调用 process_tasks 并从 python 调用该脚本

          你可以使用python调用脚本

          import subprocess
          subprocess.call("process_tasks.sh", shell=True)
          

          正如其解释here Running bash script from within python

          你的 bash 脚本可能看起来像这样

          cd your/virtualenv/directory
          source virtualenv/bin/activate
          exec /path/to/manage.py process_tasks
          

          别忘了让 process_tasks.sh 可执行

          【讨论】:

            【解决方案7】:

            这就是 django-background-tasks 的工作原理。您必须为任务运行程序运行该进程才能开始处理任务。

            https://github.com/arteria/django-background-tasks#running-tasks

            【讨论】:

            • 我可以在不执行python manage.py process_tasks命令的情况下执行后台任务吗? ?或者我可以自动化这个过程吗?
            • 据我所知,您必须在文档中运行该命令。我在工作中使用它。我们运行我们的 Django 应用程序进程(uwsgi 或 gunicorn 或类似的东西),然后我们运行 process_tasks 命令来搅动任务。
            • 您能否根据操作员的问题详细说明如何激活后台任务进程队列。我也有同样的问题。我发现的唯一明确的答案与上面的 Faiya 类似,要么通过单独的 bash 脚本运行,要么直接执行 manage.py 命令并通过 tmux 或类似的东西使其生效。但是,我想知道是否有更直接的方法可以通过 wsgi.py 文件或 django 堆栈中的其他位置调用 manage.py 命令。听起来你很有经验,任何建议都将不胜感激。
            • 我通过两种方式做到了这一点。 uwsgi 可以为您运行 cron 作业。我喜欢配置中的 cron2 语法 - uwsgi-docs.readthedocs.io/en/latest/… 。一个示例配置可能是cron2 = minute=-1 python path/to/manage.py process_tasks -d 30 这将每分钟运行该任务 30 秒。我这样做的另一种方法是使用Supervisor。 supervisord.org
            猜你喜欢
            • 2015-08-29
            • 2022-08-10
            • 1970-01-01
            • 2021-01-13
            • 2020-01-10
            • 1970-01-01
            • 2021-03-23
            • 2019-06-03
            • 1970-01-01
            相关资源
            最近更新 更多