Django celery实现异步任务操作,并在后台运行(守护进程)
没废话,直接上代码。
环境说明:
python3.6
django2.0.5
我们使用redis的作为celery任务队列,有一个合成包可以直接安装两者一起使用需要的安装包
直接在终端键入
pip install celery-with-redis
就可以安装需要的依赖包了
构建项目过程略过,直接开始进行celery配置
一、celery配置。
我们的项目名称为myproject,首先setting配置,添加
# celery settings # celery中间人 redis://redis服务所在的ip地址:端口/数据库号 BROKER_URL = 'redis://localhost:6379/3' # celery结果返回,可用于跟踪结果 CELERY_RESULT_BACKEND = 'redis://localhost:6379/3' # celery内容等消息的格式设置 CELERY_ACCEPT_CONTENT = ['application/json', ] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' # celery时区设置,使用settings中TIME_ZONE同样的时区 CELERY_TIMEZONE = TIME_ZONE
然后在PATH/myproject/myproject/即setting的同级目录下创建celery.py,初始化celery。
from __future__ import absolute_import, unicode_literals from celery import Celery from django.conf import settings import os # 获取当前文件夹名,即为该Django的项目名 project_name = os.path.split(os.path.abspath('.'))[-1] project_settings = '%s.settings' % project_name # 设置环境变量 os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_settings) # 实例化Celery app = Celery(project_name) # 使用django的settings文件配置celery app.config_from_object('django.conf:settings') # Celery加载所有注册的应用 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
这里第一行输入不能换位置,只能在首行,否则会报错。
这里的实例化celery的app我们在别处要导入,为了方便导入,我们把它放到__init__.py里,所以在/myproject/myproject/__init__.py我们加入
from __future__ import absolute_import, unicode_literals # 引入celery实例对象 from .celery import app as celery_app
这样同时也能告知django celery.py文件的存在。
二、用celery装饰我们的需要进行的异步函数。
我们在项目根目录下创建celery_tasks模块,即在PATH/myproject/下创建该模块,然后在该模块下创建tasks.py,把我们的耗时程序写进去。
from myproject import celery_app import time @celery_app.task def time_consuming_fun(): for i in range(5): time.sleep(1) print(i) return 'ok'
直接用我们的celery_app下的task方法装饰需要进行异步处理的函数即可。
三、调用异步函数。
在view中调用,这里用的是Django的类视图。
from celery_tasks.tasks import time_consuming_fun from django.views import View from django.http import JsonResponse # Create your views here. class MyView(View): def get(self,request): #异步调用 time_consuming_fun.delay() #直接调用 #time_consuming_fun() return JsonResponse({'msg':'ok','code':200})
配置好url即可。
四、启动celery。
在项目根目录下,即managy同级文件目录下,输入命令:
celery -A myproject worker -l info
此时celery在终端窗口运行,关闭终端celery就会停止。
输入命令
celery multi start w1 -A myproject -l info --logfile = celerylog.log --pidfile = celerypid.pid
此时celery为守护进程,日志记录在celerylog.log里。
日志文件可以指定路径PATH/celerylog.log,此时会在指定路径下创建日志文件。进程号文件类似。
停止或重启将开始换为stop或restart即可,所以需记录w1,即需记录woker的名称来方便重启和停止。
补充:Django项目后台不挂断运行
方法一:
1、进入项目目录下,运行下面程序:
nohup python manage.py runserver 0.0.0.0:5008 &
nohup(no hang up)用途:不挂断的运行命令
&用途:在后台运行
nohup /root/start.sh &
在shell中回车后提示:
[~]$ appending output to nohup.out
原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。
注意:在nohup执行成功后直接点击关闭程序按钮关闭终端,会断掉该命令对应的session,导致nohup对应的进程被通知一起shutdown。所以在使用nohup命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。
方法二:这个比较高级,使用screen
1、安装screen
yum install -y screen
2、新建一个screen
screen -S xiedi
这样会新开一个窗口,然后执行命令即可
python manage.py runserver 0.0.0.0:9000
3、重开一个窗口,列出所有screen进程,如下
[root@docker ~]# screen -ls There are screens on: 3029.xiedi (Attached)
4、如果想链接上这个会话,执行命令即可
screen -r 3029
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。如有错误或未考虑完全的地方,望不吝赐教。
相关文章
Django def clean()函数对表单中的数据进行验证操作
这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-09- 这篇文章主要介绍了C#启动进程的几种常用方法,实例分析了C#对系统进行的相关操作技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#中异步和多线程的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2021-01-16
- 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别...2020-06-25
- 在本篇文章里小编给大家分享了关于C#获取所有进程的方法和步骤,有需要的朋友们跟着学习参考下。...2020-06-25
- 本篇文章主要介绍了C# Socket异步通信,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要给大家介绍了关于c# winform异步不卡界面的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 这篇文章主要给大家介绍了关于JS异步的执行原理和回调的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-08
- C#获取进程的主窗口句柄的实现方法,需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了C#使用SendMessage实现进程间通信的方法,涉及C#中SendMessage方法的使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了JQuery基于FormData异步提交数据文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-02
- 这篇文章主要介绍了C#中进程的挂起与恢复操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Windows中C#启动外部程序进程的方法,例子中同时包括了进程关闭的方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了在Django中使用MQTT的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-10
- 这篇文章主要介绍了详解C语言进程同步机制的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-06-18
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
ECharts地图主要用于地理区域数据的可视化,展示不同区域的数据分布信息,通过本文给大家介绍如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据,需要的朋友参考下吧...2016-02-26解决导入django_filters不成功问题No module named 'django_filter'
这篇文章主要介绍了解决导入django_filters不成功问题No module named 'django_filter',具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-15- 这篇文章主要介绍了C#异步的世界(下),对异步感兴趣的同学,可以参考下...2021-04-26
c#异步操作后台运行(backgroundworker类)示例
这篇文章主要介绍了c#异步操作后台运行(backgroundworker类)示例,需要的朋友可以参考下...2020-06-25详解如何使用Docker部署Django+MySQL8开发环境
这篇文章主要介绍了详解如何使用Docker部署Django+MySQL8开发环境,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-19