文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Django celery实现异步任务操作,并在后台运行(守护进程)

2024-04-02 19:55

关注

没废话,直接上代码。

环境说明:

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯