如何在“django-background-tasks”中激活进程队列

时间:2016-12-18 04:59:02

标签: django multithreading python-2.7 background-task

我是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. ")

忽略我的逻辑。

7 个答案:

答案 0 :(得分:1)

好吧,您可以制作一个bash脚本来调用process_tasks并从python调用该脚本

可以使用python调用脚本

<button 
  *ngFor="let item of items; let i = index" 
  [ngClass]="(lastClickedIndex == i) ? 'activeBtn': ''" 
  (click)="addDistrict(item);changeActive(i)" 
  ion-button 
  #disable>
  {{item.name}}
</button>

如此处所述 Running bash script from within python

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

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

不要忘记使process_tasks.sh可执行

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

万一其他人试图使它正常工作-我从Dockerfile调用了一个shell脚本,然后运行两个命令。一种启动Web服务器(gunicorn或run_server),另一种运行manage.py process_tasks进程。重要的是将process_tasks进程作为后台任务运行。

在我的Dockerfile的底部,我有: ['Salvatore', 'Abdulla']

我的run_app.sh文件如下:

CMD ["./run_app.sh"]

请注意流程任务命令中的结尾&。这使Shell脚本能够继续处理并运行gunicorn命令。

希望这对某人有帮助。

答案 4 :(得分:0)

python manage.py process_tasks&

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

答案 5 :(得分:0)

您必须运行process_tasks命令来执行已计划的任务。没有别的办法了。 Process_tasks定期检查数据库中计划的任务,并在后台执行它们。

在本地环境中

打开一个终端,进入您的应用程序文件夹,然后启动命令python manage.py process_tasks。如果您使用的是virtualenv,请确保先将其激活。

在生产环境中

选项1:执行cron作业

一种解决方案是使用process_tasks启动cron job命令。请注意,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 

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

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

好处:

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

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

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

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

答案 6 :(得分:-1)

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

from django.core.management import call_command

call_command('process_tasks')

签出文档here