云计算之celery+django+supervisor实现定时任务

celery详解(使用django+celery实现异步及定时任务以及使用supervisor进行管理) 最近工作之余,记录一下自己的笔记,首先来介绍一下celery (一)、为什么要使用celery,业务场景 1、我们平时工作中,经常会碰到一个视图里面写了很多逻辑,导致里面有一些很耗时的操作,比如发送邮件、短信之类的操作,这些我们一般是调用第三方sdk去做的,通常客户端接收响应需要等待,降低了服务器的吞吐量及性能 2、服务器难免会有定时任务的需求,比如用户数据更新,缓存清除等等 (二)、celery介绍 为了解决以上问题,我们可以使用celery Celery是一个功能完备即插即用的任务队列。 celery适 阅读详情
一. celery概要
    1. 概念
        分布式任务队列,django中所有需要用到异步操作的,或者定时操作的,都可以使用celery
    2. 组件
        Celery Beat : 任务调度器. Beat 进程会读取配置文件的内容, 周期性的将配置中到期需要执行的任务发送给任务队列.
        Celery Worker : 执行任务的消费者, 通常会在多台服务器运行多个消费者, 提高运行效率.
        Broker : 消息代理, 队列本身. 也称为消息中间件.
        Producer : 任务生产者. 调用 Celery API , 函数或者装饰器, 而产生任务并交给任务队列处理的都是任务生产者.
        Result Backend : 任务处理完成之后保存状态信息和结果, 以供查询.
    3. 工作流程
        producer发布任务,传递给broker,borker 传递给 beat,beat 将任务调度给worker,worker执行任务并将结果存入数据库(redis等)

二. celery搭建
    1. 安装redis
        官网下载对应版本的redis tar包
        tar -xf redis-3.2.12.tar.gz
        cd redis-3.2.12
        make
        make install
        ./utils/install_server.sh
    2. 安装celery
        pip3.6 install celery
    3. 使用celery简单测试
        1). 编写tasks.py
            import time
            from celery import Celery
            # 使用redis作为broker(消息队列)
            celery = Celery('tasks', broker='redis://localhost:6379/0')
            # 创建任务函数
            @celery.task
            def sendmail(mail):
                print("sending mail to %s..."%(mail['to']))
                time.sleep(2.0)
                print('mail sent.')

        2). 进入tasks.py目录启动 celery 处理任务
            celery  -A tasks worker --loglevel=info
            说明:celery对tasks任务启动一个worker线程,日志级别为info
        3). 另开命令行进入tasks.py目录编写测试脚本 test.py
            from tasks import sendmail
            import time
            while 1:
              print(sendmail.delay(dict(to='mx_steve@163.com')))
              time.sleep(1)
            调用delay函数,是将任务函数加入到队列中
        可以看到worker线程有对应的处理输出,测试celery完成,目前celery可以使用了,但是还不能放入后台运行,可以使用supervisor进行后台运行管理
    4. supervisor 安装使用
        1). 使用pip安装supervisor
            pip3.6 install supervisor
        2). 生成supervisor配置文件
            echo_supervisord_conf > /etc/supervisord.conf
        3). 修改supervisor配置文件
            vim /etc/supervisord.conf
                # supervisor子配置目录
                [include]
                files = /etc/supervisor/*.conf
                # supervisor web管理界面
                [inet_http_server]
                port=192.168.89.133:9001
                username=user
                password=123
        4). 创建子配置文件目录和子配置文件
            mkdir /etc/supervisor
            vim /etc/supervisor/test.conf
                [program:testpy]
                command=python /opt/celery/test1.py              ; 要执行的程序
                ;process_name=%(program_name)s
                ;numprocs=1
                directory=/opt/celery/              ; 要进入的项目目录(先进入,再执行)
                ;umask=022
                priority=999                             ; 任务要执行的优先级
                startsecs = 5                            ; 启动 5 秒后没有异常退出,就当作已经正常启动了
                autorestart = true                       ; 程序异常退出后自动重启
                startretries = 3                         ; 启动失败自动重试次数,默认是 3
                stdout_logfile = /opt/celery/supervisor.log
        5). 编写测试脚本/opt/celery/test1.py
            import time
            while 1:
              with open('/tmp/bb.txt','a') as fobj:
                fobj.write('111\n')
              time.sleep(1)
        3). 通过配置文件启动supervisor
            supervisord -c /etc/supervisord.conf
        4). 查看运行状态
            supervisorctl status
                testpy                           RUNNING   pid 61435, uptime 0:02:32
            注意报错:gave up: testpy entered FATAL state, too many start retries too quickly
            原因:
                1. 脚本启动比较慢,将配置文件中startsecs调大一些
                2. 脚本运行退出,非死循环状态,也会报这个错 , 这种情况也不算报错,执行完成自然退出,配置文件中设置了重启3次,重启执行完后自然又会退出
            supervisorctl stop testpy 停止任务
            supervisorctl start testpy 启动任务
    5. 使用 supervisor 控制 celery 半个小时更新一次
        1). 将第4步的test1.py脚本更换成第3步的test.py脚本,celery就被supervisor控制
        2). 定义时间,半个小时更新一次脚本
           a. 创建supervisor子配置文件[调度器] /etc/supervisor/get_version_beat.conf
                [program:get_version_beat]
                # 执行命令
                directory=/opt/gits/orange
                command = /root/venv/bin/celery --workdir=/opt/gits/orange -A webhook beat -l info
                # 日志配置
                loglevel = info
                stdout_logfile = /tmp/get_version_beat.log
                stderr_logfile = /tmp/get_version_beat.log
                stdout_logfile_maxbytes = 50MB
                stdout_logfile_backups = 1
                # 给每个进程命名,便于管理
                process_name = get_version_beat%(process_num)s
                # 启动的进程数,设置成云服务器的vCPU数
                numprocs_start = 1
                numprocs = 1
                # 设置自启和重启
                autostart = true
                autorestart = true
                redirect_stderr = True
           b. 创建supervisor子配置文件[消费者] /etc/supervisor/get_version_worker.conf
                [program:get_version_worker]
                # 执行用户
                # user = root
                # 执行的命令
                directory=/opt/gits/orange
                command = /root/venv/bin/celery --workdir=/opt/gits/orange -A webhook worker -l info
                # 日志文件配置
                loglevel = info
                stdout_logfile = /tmp/get_version_worker.log
                stderr_logfile = /tmp/get_version_worker.log
                stdout_logfile_maxbytes = 50MB
                stdout_logfile_backups = 1
                # 给每个进程命名,便于管理
                process_name = get_version_worker%(process_num)s
                # 启动的进程数,设置成云服务器的vCPU数
                numprocs_start = 1
                numprocs = 1
                # 设置自启和重启
                autostart = true
                autorestart = true
                redirect_stderr = True
           c. 到项目根目录配置celery.py文件
                ... ...
                app.conf.update(
                    CELERYBEAT_SCHEDULE = {
                        ... ...
                        'get_version':{
                            'task': 'celery_app.tasks.get_version',
                            'schedule': crontab(minute='1', hour='1', day_of_week='*', day_of_month='*', month_of_year='*'),
                        }
                    }
                }
           d. 进入到celery_app目录,进行功能编写
                vim get_version.py
                    import paramiko
                    import requests
                    import datetime
                    import redis
                    import json
                    import os
                    import subprocess
                    from threading import Timer
                    import logging

                    logger = logging.getLogger('t3logger')

                    class GetVersion():
                        def __init__(self):
                            pass

                        def par_ver(self, host0, app_name):
                            client = paramiko.SSHClient()
                            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
                            client.connect(hostname=host0, port=2222, username='dc')
                            stdin, stdout, stderr = client.exec_command("awk '/jfrog/' /data/scripts/deploy_%s.sh | tail -1 | awk '{print $4}' | awk -F/ '{print $4}'" % (app_name))
                            out = stdout.read().decode('utf-8')
                            err = stderr.read().decode('utf-8')
                            if out == '':
                                out = '0'
                            client.close()
                            out = out.strip()
                            return out

                        def chaoshi(self, args, timeout):
                            p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                            timer = Timer(timeout, lambda process: process.kill(), [p])
                            try:
                                timer.start()
                                stdout, stderr = p.communicate()
                                return_code = p.returncode
                                if stdout != b'':
                                    return True
                                else:
                                    return False
                            finally:
                                timer.cancel()

                        def main(self):
                            os.system('rm -f /tmp/hosts_questions.txt')
                            # 此处为数据接口,此功能不赘述
                            all_keys = requests.get("http://10.0.0.1:10080/assets/inventory/--list/None/")
                            all_objs = all_keys.json()
                            i = 1
                            objs = []
                            for item in all_objs:
                                if item == 'all' or item == '_meta':
                                    continue
                                if 't3_data_apps' in item:
                                    env = item.split('_ktz_data_apps_')[0]
                                    center = 'ktz_data_apps'
                                    app_name = item.split('_ktz_data_apps_')[-1]
                                elif 'ktz_m' in item:
                                    env = item.split('_ktz_m_')[0]
                                    center = 'ktz_m'
                                    app_name = item.split('_ktz_m_')[-1]
                                else:
                                    env = item.split('_')[0]
                                    center = item.split('_')[1]
                                    app_name = item.split('_')[-1]
                                hosts = all_objs[item]['hosts']
                                str = ''
                                for host in hosts:
                                    str += host + ','
                                hosts_str = str
                                host0 = all_objs[item]['hosts'][0]
                                result = self.chaoshi(['telnet', host0, '53742'], 2)
                                if result == False:
                                    os.system('echo %s >> /tmp/hosts_questions.txt' % (host0))
                                    continue
                                ver = self.par_ver(host0, app_name)
                                now = datetime.datetime.now().strftime('%Y-%m-%d')
                                objs.append([i, center, app_name, ver, hosts_str, now, env])
                                i += 1
                            red = redis.Redis(host='localhost', port=6379, db=1)
                            objs_json = json.dumps(objs)
                            red.set('versions', objs_json)


                    if __name__ == '__main__':
                        gv = GetVersion()
                        gv.main()
           e. 进入到celery_app目录的tasks.py文件,引入get_version功能
                from celery_app.get_version import GetVersion
                @shared_task
                def get_version():
                    """
                    周期性收集服务器上对应的服务版本信息
                    :return:
                    """
                    info = '周期性收集服务器上对应的服务版本信息'
                    logger.info(info)
                    gv = GetVersion()
                    gv.main()
           f. 启动django服务
           g. 重启supervisord服务
                killall -9 supervisord
                supervisord -c /etc/supervisord.conf
    6. 问题排错
           问题1:查看日志,发现beat启动错误
                tail -10f /tmp/get_version_beat.log
                    celery beat v4.3.0 (rhubarb) is starting.
                    ERROR: Pidfile (celerybeat.pid) already exists.
                排错思路:不用创建beat调度器,因为已经存在了
                    1. 去掉get_version_beat.conf
                        rm -f /etc/supervisor/get_version_beat.conf
                    2. 启动supervisor查看是否还有错误
                        tail -10f /tmp/get_version_worker.log
                            [2019-12-16 17:38:34,897: INFO/MainProcess] Connected to redis://127.0.0.1:6379/8
                            [2019-12-16 17:38:34,903: INFO/MainProcess] mingle: searching for neighbors
                            [2019-12-16 17:38:35,945: WARNING/MainProcess] /root/venv/lib/python3.6/site-packages/celery/app/control.py:54: DuplicateNodenameWarning: Received multiple replies from node name: celery@k8snode01.
                            Please make sure you give each node a unique nodename using
                            the celery worker `-n` option.
                              pluralize(len(dupes), 'name'), ', '.join(sorted(dupes)),
                            [2019-12-16 17:38:35,946: INFO/MainProcess] mingle: all alone
                            [2019-12-16 17:38:35,954: WARNING/MainProcess] /root/venv/lib/python3.6/site-packages/celery/fixups/django.py:202: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
                              warnings.warn('Using settings.DEBUG leads to a memory leak, never '
                            [2019-12-16 17:38:35,954: INFO/MainProcess] celery@k8snode01 ready.
                        supervisorctl status
                            get_version_worker:get_version_worker1   RUNNING   pid 7598, uptime 0:01:55
                        启动正常,并无错误,等待运行结果结束
                        虽然没有大问题,但是看get_version_worker.log日志,查看报错 UserWarning: Using settings.DEBUG leads to a memory leak,主项目settings配置文件debug改为false即可
           问题2:结果并没有实现,没有创建/tmp/abc.txt测试文件,没有将数据导入到redis库中,不知道原因是啥?
                排错思路:
                    1. 直接运行 get_version.py 没有问题,数据也可以导入到redis库中,说明 get_version.py 脚本没有问题
                    2. 检查 celery_app 目录下 tasks.py 脚本, 引入GetVersion类并实例化调用方法,没有问题
                    3. 'get_version':{ 冒号后面没有空格,重新运行
                        tail -10f /tmp/supervisord.log
                            'get_version_worker1' with pid 103842 显示这个任务已经启动
                        tail -10f /tmp/get_version_worker.log
                        日志都没啥变化,不是这个原因引起的。
                    4. 第二天早上查看,日志神奇的出现了,而且redis也有了对应的键值对,猜测是 celery schedule 的单位问题
                        于是将schedule后面写上3600(秒)
                        重启django服务,更新 supervisorctl 配置
                        supervisorctl update
                        supervisorctl reload (重启supervisord)
                        supervisorctl status
                            get_version_worker:get_version_worker1   RUNNING   pid 32703, uptime 0:02:08
                        启动时间:9:30;测试时间:10:30-40之间
                        结果:10:50后还没有数据。
                        分析:收集信息需要时间,1100个服务,每个花费5s收集,总共需要1100*5/60=91分钟,9:30+91=11:00左右结束,还没有写入,11:20查看一次,
                        建议:先测试,收集少量数据,就不会花费太多时间
                        结果:到下午 13:30 redis 里都没有数据
                        先排除日志报错:debug=false和名称相同的错,配置了启动位置加了 -n get_version_worker
                    5. 查看 supervisorctl 是否可以控制celery
                        使用 gv.main()函数(将字符串传入reids中) 脚本测试
                    6. 第三天早上查看,redis里又存入了versions键值对,在/tmp下也创建了相应的测试文件abc.txt,时间是今天的9:00
                        思考:supervisorctl 里的任务压根没有运行,但是数据还是创建了,可能是celery自己创建的,并不受supervisor控制
                        排错:
                            ss -anptu | grep celery
                            发现有很多celery进程在运行,杀死celery和supervisord进程,删除redis中的键值
                            killall -9 celery
                            killall -9 supervisord
                            redis-cli
                            > select 1
                            > keys *
                                1) "versions"
                            > del versions
                            重新启动django和supervisord
                            supervisord -c /etc/supervisord.conf
                            ss anptu | grep celery ; ss anptu | grep supervisord 查看进程已经存在
                            查看日志也没有什么报错
                            进入redis并没有看到数据存入库中,泪奔
                            /etc/supervisor/下没有配置beat,添加配置,重启supervisord和celery,发现版本信息可以存入到redis库中,踩了好几天的坑,问题终于解决了。
                    问题排错总结:
                        看来第5步/etc/supervisor/get_version_beat.conf这个文件还不能删,要回顾一下celery定时任务原理,如果没有beat,就相当于没有了调度器,没有任务调度器,配置了也不会执行。
三. 总结
    使用任何一项新的技术,一定要将原理搞清楚,弄明白,然后再对照着原理搭建自己的任务,每个环境都不漏下,就很大可能会走通,不会出现什么问题。


Django+Celery+Redis+Supervisor 实战部署教程 Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。Django遵循MVC(Model-View-Controller)架构模式,将项目分为三个主要部分:模型(Models)、视图(Views)和控制器(Controllers),而在Django中,控制器的功能是由URL路由来处理的。为了开始一个Django项目,您需要按照以下步骤操作:安装Django包,通过命令行执行使用来创建一个项目,mysite是项目名称进入项目目录。 阅读详情

相关推荐

数值计算之 插值法(4)切比雪夫零点插值

数值计算之 插值法(4)切比雪夫零点插值前言插值点选取第一类切比雪夫多项式拉格朗日插值多项式的余项切比雪夫零点插值后记 前言 上篇插值法讨论了多项式插值的解,以及龙格现象。本篇将介绍一种在抽取节点时有效降低龙格现象的方法——切比雪夫零点插值。 插值点选取 插值多项式阶数较高时,在取值空间均匀取点,容易出现龙格现象。 即区间边缘的插值结果与原函数差异很大,而区间中央的插值结果相对较好。这表明,高阶多项式插值对区间中央的节点拟合好,而对两端节点拟合效果差。 自然而然会想到,在两端多采样一些节点,在中间少采样一

qq_41035283的博客 1万+

python celery 使用及后台运行(supervisor)

Celery是Python开发的分布式任务调度模块。 一、安装: 1.安装celery: pip install celery 2.安装redis: sudo apt-get install redis-server 3.安装pyredis: pip install redis 二、使用: 1.新建一个py文件task.py,内容如下: import time from cel

平头哥(Adger)的博客 1万+

海康VisionMaster全局通信实战:从数据接收到流程触发

本文详细解析了海康VisionMaster全局通信的实战应用,重点阐述了如何通过配置通信模块与编写全局脚本,实现从外部设备(如PLC)接收数据并触发内部视觉流程。文章以TCP/IP通信为例,深入讲解了数据接收、解析、全局变量设置及流程触发的核心代码与调试技巧,帮助用户打通自动化项目中的设备联动关键环节。

weixin_29295541的博客 568

CELERY里,这个WARNING如何消除?

原来命令行里有提示,保证用-n给与不同的名字即可。 比如:   [program:celeryd]command=/usr/local/python27/bin/celery worker --app=settings -c 4 -l info -n celeryd [program:celerybeat]command=/usr/local/python27/bin/celery wor...

weixin_34406086的博客 805

Codesys电子凸轮功能块MC_CamIn的masteroffset和slaveoffset参数的使用

问题1:在Codesys使用作轴电子凸轮时,MC_CamTableSelect的参数设置为MasterAbsolute=1,SlaveAbsolute=1,此设置为绝得模式, 此时主从轴当前位置都不为零时,此时Masteroffset=0、slaveOffset=0,凸轮启时出现突变,实轴无法启动。问题分析:在觉得模式下,主轴位置和从轴为是对应凸轮表的相位的,Masteroffset=0、slaveOffset=0,启动点时在主轴位置=0,从轴位置=0的点启动,此时主轴当前位置不为零则主从轴位置发生突变,

weixin_43587371的博客 1797

【面试题】MySQL索引相关的面试题(红黑树,hash,B树,B+树)

自己整理了几个面试题分享给大家 问题1:红黑树为什么那样设计? 首先聊一下二叉搜索树,主要特点是左节点比根节点小,右节点比根节点大,并且左右子树都是二叉搜索树。缺点是在极端情况下,比如插入都是有序的,就会出现退化的情况有序序列树退化成链表。 二叉搜索树 退化成链表的二叉搜索树 此时,要想让树的节点平均分布就需要平衡树了,红黑树就是平衡树的一种(平衡二叉搜索树)。然后,一棵树的查询性能取决...

Mr_黑_ 的博客 4042

celery基础知识

网络上有各种celery的资料,但看着眼花缭乱,以下资料自己通过各种网站搜索,整理汇总的,只作为自己笔记使用,外人看着会有点乱。 另外,说是celery使用redis作为broker,会出现任务重复执行问题。我通过各种手段模拟,特意把“visibility_timeout”时间改的比ETA还要小,结果还是没出现任务重传问题。不知道是否因为我用celery 4.3,截止到写这篇文章为止,是最新版本的...

linqunbin的博客 2734

基于deepseek+dify+达梦实现自然语言查询数据库

自然语言查询数据库信息

weixin_43974943的博客 1591

最新小白详细描述在centos7.5上安装python3并使用Nginx+virtualenv+supervisor来部署tornado项目(整理集合结合实际)系列1

Centos7默认自带了Python2.7版本(选择最小安装可能没有),但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装.(本文是大致部署好后一段时间才写的,由于中间遇到许多坑导致无法知道有些步骤是否起作用了,细节可能会有一些出入请自行辨别。) 1.安装python3.5 安装必要工具 yum-utils ,它的功能是管理repository及扩展包的工具 (主要是针对r...

qq_36401512的博客 451

RK3588 实战级 YOLOv5 Android 全解析:NPU 量化 + 多线程 + 跟踪算法,源码一次买齐

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

FJN110的博客 156

基于Slim-Neck架构的YOLOv11轻量化特征融合方案(实现超轻量级与高精度的双重突破)

购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。

m0_64661770的博客 250

安装使用supervisor来启动服务

supervisor 使用方法 supervisor(官网)是一个unix的系统进程管理软件,可以用它来管理apache、nginx等服务, 若服务挂了可以让它们自动重启。当然也可以用来实现golang的守护进程. 学完这篇教程后,我们希望达到如下的目标: 服务挂掉后,自动重启 可执行文件或者配置文件修改后,服务自动重启 让我们开始吧! 1.supervisor安装 1.以上tar包...

dhc8242的博客 1996

30天入门 SAP BTP 开发系列之一:SAP 开发顾问为什么要学习 SAP BTP 开发?能带来哪些收获?

国内 SAP 开发顾问们的微信朋友圈,最近可能都被 SAP 和阿里这两家巨头宣布合作的重磅消息刷屏了吧。近日,德国软件巨头SAP SE与中国电商巨头阿里巴巴集团宣布建立战略合作伙伴关系。根据协议,阿里巴巴集团将利用 SAP Cloud ERP Private 强化企业基础设施,并采用联合上市策略为全球客户创造卓越价值。阿里巴巴将集成 SAP Business Suite,以简化系统维护与升级流程,并实现 AI 功能与核心业务流程的无缝整合。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2370

Celery 使用supervisor 配置后台运行

1. 安装 supervisor apt install supervisor 或 pip3 install supervisor 2. 进入/etc/supervisor/conf.d下,新建celery.conf文件,写入如下内容: [program:celery] command=/usr/bin/celery -A celery_tasks worker -l info # 运行的命令 directory=/home/xxx/xxx # 命令执行的目录

s_daqing的博客 862

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Celery-4.1 用户指南: Workers Guide

启动工作单元 停止工作单元 重启工作单元 处理信号 文件路径中的变量 并行 远程控制 命令 时间限制 速率限制 每个孩子的最大任务数 每个孩子的最大内存 自动扩展 队列 探查工作单元 附加命令 编写自己的远程控制命令

李兵的专栏 6210

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

supervisor 重启_分布式任务调度Celery,(二)Supervisor使用

继上一篇介绍了Celery的安装和代码工程使用后,今天介绍Supervisor,部署和使用Supervisor可以提高Celery系统的稳定性,高可用性。希望能帮助到需要的朋友们,图文创作不易,欢迎关注哦。一,简介Supervisor是一个进程管理工具,也可以理解为进程守护监控,当进程中断的时候Supervisor能自动重新启动它。Supervisor是用Python开发的一套通用的进程管理程序,...

weixin_39571219的博客 647

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

django + celery +supervisor,实现异步任务+后台进程

项目中用到了后台执行发邮件推送, 一开始以为celery可以实现后台进程,结果发现关掉命令行窗口就结束进程了,于是网上找方法。 这里借助Supervisor进行管理程序,将非后台运行的程序变成后台运行。包括Redis也可以丢给Supervisor管理。 1、安装Supervisor Supervisor是Python开发的,用于在Linux服务器中管理进程。 除了可以讲上面转换程序为后台程序之外,...

时光未央的博客 1040

Django+celery使用supervisor进行进程守护

1.库版本 supervisor 4.2.5 django-celery-beat 2.5.0 django-celery-results 2.5.1 Django 4.2.6 环境: Linux项目路径:/opt/new/new_project 2.制作软连接已知,Python的安装目录是 /usr/local/python3,其下有 bin/include/lib和share四个目录,其...

唯有热爱 可抵万难 537

Celery多队列

2、task_content1和task_content2是任务包,可以根据自己需要添加各种任务的包以便分类管理,里面的tasks.py是固定名称,会根据名称找任务。如果没有加-Q参数,启动的worker会监听task_queues 中配置的所有队里中的任务。1、项目名称Demo,新建一个用于celery的包 celerytest,目录结构如上图。在启动worker时指定该worker执行哪一个queue中的任务。3、config.py是celery配置文件。注意目录的结构,结构,结构。...

u014783334的博客 1219

Python 系统管理高级教程(六)

原文:Pro Python System Administration 协议:CC BY-NC-SA 4.0 十二、分布式信息处理系统 在前三章中,我们构建了一个基于 XML-RPC 消息协议的分布式监控系统。虽然它工作得很好,但它可能缺少一些功能,如消息优先级和任务调度。我们可以在已经编写的代码中添加额外的功能,但是我将向您展示如何用一个更健壮、功能更全的基于分布式任务队列 Celery 的系统来替换定制的消息传递平台。 消息和任务队列快速介绍 任务队列是一种强大的机制,允许您将工作分割成更小的块,将

龙哥盟 1010

supervisor管理进程用法详解

supervisor管理进程用法详解

IT之一小佬的博客 2181

Django Celery 4.3.0 使用supervisor 配置后台运行

Celery 4.3.0 使用supervisor 配置后台运行 参考文献 https://thomassileo.name/blog/2012/08/20/how-to-keep-celery-running-with-supervisor/ 前言 Supervisor是一个使你的进程可以在unix进程后台运行的python库。 本篇章的相关软件版本如下: Celery 4.3.0 supervisor 4.0.4 安装 pip3 install supervisor 安装完毕后,查看版本如下: [

ltycsdn007的博客 329

7. Celery 4.3.0 Routing 任务队列路由功能

签名的篇章基本说明了任务签名、任务调用、任务执行流程等等,下面来看看路由设置。回顾celery模块的文档结构需求场景假如我们有两个worker,一个worker专门用来处理邮件发送任务和...

DevOps海洋的渔夫@专栏 1098

每日自动发布助手(DailyPost)

是一个自动化工具,旨在帮助用户每天自动搜索相关领域的文章,经过 AI 润色后,自动发布到 优快云、知乎、简书等平台。无论是技术分享、生活感悟还是行业动态,这个工具都能帮你轻松搞定!🚀。

2301_78117384的博客 532

supervisor进程管理工具

Supervisor supervisor是进程管理工具 安装 supervisor对python3支持不好,须使用python2 sudo pip install supervisor 配置 运行echo_supervisord_conf命令输出默认的配置项,可以如下操作将默认配置保存到文件中 echo_supervisord_conf > supervisord.conf ...

limengshi138392的博客 504

Supervisor(一)

2021SC@SDUSC 首先,我们再来看一下supervisor的工作: Storm将每个节点分为主控节点和工作节点两种,其中主控节点只有一个,工作节点可以有多个。 每个工作节点运行Supervisor守护进程,负责监听工作节点上已经分配的主机作业,启动和停止Nimbus已经分配的工作进程。 supervisor会定时从zookeeper获取拓补信息topologies、任务分配信息assignments及各类心跳信息,以此为依据进行任务分配。 在supervisor同步时,会根据新的任务分配情

siwujidan_77的博客 543
上一篇: kubernetes 服务发现问题——kubedns[更新中]
下一篇: 云计算之celery系统优化
mx_steve
博客等级 码龄8年 57粉丝 102原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值