我是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. ")
忽略我的逻辑。
答案 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
参数以适合您的需求!
好处:
选项2。在服务器启动时启动命令
基本上,您将必须创建一个包含相同启动命令的脚本文件,并将您的服务器配置为在启动时运行它。
您会失去不时重新启动进程的好处,因此您可能必须监视其运行状况。如果您走这条路,一个好的方法是使用supervisord来监视您的过程。
答案 6 :(得分:-1)
您可以使用以下代码直接在django项目中调用manage.py命令:
from django.core.management import call_command
call_command('process_tasks')
签出文档here