#celery#周期性任务

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

143327_HZ6V_987833.jpg

玩了一个星期的clannad,是时候干点事了。


折腾了下celery周期性任务:

celery提供了一个叫celery beat的服务,用于定时驱使worker执行任务。也就是说,如果本地没有活动的worker,它将不会得到任何执行结果,他只是负责把任务消息传到rabbitmq,一旦启动一个可用worker,则自动从rabbitmq获取任务信息并执行。

与此配置相关的参数是CELERYBEAT_SCHEDULE,我把我的celery应用proj的所有配置内容都放置在一个config.py文件中:

from __future__ import absolute_import
from datetime import timedelta
from celery.schedules import crontabCELERY_TASK_RESULT_EXPIRES=3600
CELERY_TASK_SERIALIZER='json'
CELERY_ACCEPT_CONTENT=['json']
CELERY_RESULT_SERIALIZER='json'CELERYBEAT_SCHEDULE = {'add-every-1-min': {'task': 'proj.agent.add','schedule': crontab(),'args': (16, 16),},
}
#CELERYBEAT_SCHEDULE = {
#    'add-every-2-seconds': {
#        'task': 'proj.agent.add',
#        'schedule': timedelta(seconds=3),
#        'args': (16, 16)
#    },
#}CELERY_TIMEZONE = 'UTC'

目前的定时任务是:

add-every-4-s

task指定了相应的任务:proj目录下agent模块的add函数

schedule指定了定时工具,这里是celery.schedules的crontab

args是任务的参数


此时我们回到proj所在的目录中,启动一个worker:

root@workgroup0:~/celeryapp/configtest# ls
celerybeat-schedule  logging  proj
root@workgroup0:~/celeryapp/configtest# celery -A proj worker --loglevel=INFO
/usr/local/lib/python2.7/dist-packages/celery/platforms.py:766: RuntimeWarning: You are running the worker with superuser privileges, which is
absolutely not recommended!Please specify a different user using the -u option.User information: uid=0 euid=0 gid=0 egid=0uid=uid, euid=euid, gid=gid, egid=egid,-------------- celery@workgroup0.hzg.com v3.1.17 (Cipater)
---- **** ----- 
--- * ***  * -- Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         proj:0x7f0027635510
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     amqp://guest@loaclhost//
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- 
--- ***** ----- [queues]-------------- .> celery           exchange=celery(direct) key=celery[tasks]. proj.agent.add. proj.agent.mul. proj.agent.writefile. proj.agent.xsum[2015-05-24 15:00:37,873: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2015-05-24 15:00:37,940: INFO/MainProcess] mingle: searching for neighbors
[2015-05-24 15:00:38,980: INFO/MainProcess] mingle: all alone
[2015-05-24 15:00:39,021: WARNING/MainProcess] celery@workgroup0.hzg.com ready.

worker启动成功,此时再开一个终端,启动beat服务:

root@workgroup0:~/celeryapp/configtest# celery -A proj beat -s celerybeat-schedule #这里的celerybeat-schedule指定一个记录文件celery beat v3.1.17 (Cipater) is starting.
__    -    ... __   -        _
Configuration ->. broker -> amqp://guest:**@localhost:5672//. loader -> celery.loaders.app.AppLoader. scheduler -> celery.beat.PersistentScheduler. db -> celerybeat-schedule. logfile -> [stderr]@%INFO. maxinterval -> now (0s)
[2015-05-24 15:02:53,761: INFO/MainProcess] beat: Starting...
[2015-05-24 15:03:00,000: INFO/MainProcess] Scheduler: Sending due task add-every-1-min (proj.agent.add)#已经相隔1min了[2015-05-24 15:04:00,066: INFO/MainProcess] Scheduler: Sending due task add-every-1-min (proj.agent.add)

返回看看worker的输出:

[2015-05-24 15:01:50,827: INFO/MainProcess] Task proj.agent.add[9b6f962a-9b66-4fde-916f-fc5a951ad599] succeeded in 0.0342152439989s: {'value': '32'}
[2015-05-24 15:02:24,923: INFO/MainProcess] Received task: proj.agent.add[e4b9840b-09f6-4db6-88c1-2a418b11d393]
[2015-05-24 15:02:24,947: INFO/MainProcess] Task proj.agent.add[e4b9840b-09f6-4db6-88c1-2a418b11d393] succeeded in 0.0200459280004s: {'value': '32'}
[2015-05-24 15:03:00,015: INFO/MainProcess] Received task: proj.agent.add[98f44dd1-e6e2-4457-bfd6-ff59d0ee6d2f]
[2015-05-24 15:03:00,031: INFO/MainProcess] Task proj.agent.add[98f44dd1-e6e2-4457-bfd6-ff59d0ee6d2f] succeeded in 0.0125673500006s: {'value': '32'}

这就是周期性任务的执行。


遇到的坑:

在配置文件中,from __future__ import absolute_import这一行很关键,如果没有这一行,

from celery.schedules import crontab

这个命令执行时会报错,celery beat无法正常启动。


补充:

默认情况下,celery beat使用UTC时区,你也可以配置其他时区:

CELERY_TIMEZONE = 'Europe/London'


关于设置任务执行周期,你可以通过datetime的timedelta设置,可以让任务执行间隔精确到秒,相应的配置如下:

CELERYBEAT_SCHEDULE = {'add-every-2-seconds': {'task': 'proj.agent.add','schedule': timedelta(seconds=3),'args': (16, 16)},
}

也可以用crontab风格的:

CELERYBEAT_SCHEDULE = {# Executes every Monday morning at 7:30 A.M'add-every-1-min': {'task': 'proj.agent.add','schedule': crontab(),'args': (16, 16),},
}


关于一个CELERYBEAT_SCHEDULE的可以配置的参数,以及crontab的详细示例,请参见celery官方文档。


关于启动celery beat的tips,我这里只贴原文:

Starting the Scheduler

To start the celery beat service:

$ celery -A proj beat

You can also start embed beat inside the worker by enabling workers -B option, this is convenient if you will never run more than one worker node, but it’s not commonly used and for that reason is not recommended for production use:

$ celery -A proj worker -B

Beat needs to store the last run times of the tasks in a local database file (namedcelerybeat-schedule by default), so it needs access to write in the current directory, or alternatively you can specify a custom location for this file:

$ celery -A proj beat -s /home/celery/var/run/celerybeat-schedule


转载于:https://my.oschina.net/hochikong/blog/419191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WTMPlus 1.1 发布

点击上方蓝字关注我们1.1版本WTMPlus上线一个多月以来,得到了越来越多用户的喜爱。虽然1.0版本还有不少问题,但是它的核心理念和功能受到了用户的认可。1.1版本修复了大量用户反馈的易用性的问题和系统Bug,并且加入了强悍的图表工具。图表编辑…

backgroundworder 简单使用

//手动创建backgroundworker组件///创建 private backgroundworker bgd new backgroundworker(); ///声明xmldoment private xmldoment doment null; /// Load 加载事件 private void Form1_Load(object sender , EventArgs e) { /// 执行操作 this.bgd.DoWorker delegate(ob…

4部“教材级”纪录片,有生之年必看系列!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片是以真实生活为创作素材,以真人真事为表现对象,并对其进行艺术的加工与展现的,以展现真实为本质,并用真实引发人们思考的电影或电视艺术形式。好的纪录片就像打开了一扇新世界的大门&…

mysql数据恢复时显示多线程恢复_MySQL多线程备份恢复工具mydumper,myloder

mydumper备份时,数据和表结构是分开的,比如备份test表时,会生成test.sql文件和test.schema.sql文件。myloader导数据的时候默认不会记录二进制日志,即使你的sql_log_binon.准备安装介质:下载mydumper-0.6.2.tar.gz下载…

IM实现联系人及联系人分组的数据库设计

openfire中通过ofgroup/ofgroupprop/ofgroupuser实现组织结构中的分组,通过ofroster/ofrostergroups实现好友关系中的分组。但是呢,我们做二次开发的时候,希望能够有自己的个人联系人及分组,它没有确认过程,也就是说&a…

python生成器yield原理_Python generator生成器和yield表达式详解

前言Python生成器(generator)并不是一个晦涩难懂的概念。相比于MetaClass和Closure等概念,其较为容易理解和掌握。但相对于程序结构:顺序、循环和分支而言其又不是特别的直观。无论学习任何的东西,概念都是非常重要的。正确树立并掌握一些基础…

Java 操作POI 之复制sheet页

2019独角兽企业重金招聘Python工程师标准>>> 来点干货直接上代码,就不细说了 package com.qs.web.tools.core.excel; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.apache.poi.hssf.us…

Serverless 落地实践

.Net Core Serverless初体验什么是ServerlessServerless 是一个当今软件世界中比较新的话题。它并没有一个普遍公认的权威定义,每个人每个企业对它的解释可能都有不同,而 Serverless 正是在这种情况下不断发发展的。但是就算如此,有一些 Serv…

KOFLive Beta Daily-Scrum 9

组 员今天的工作进 度问 题明天的计划田 飞Work Item 38911:角色四照片拍摄 Work Item 38897:键盘输入人物四的图片已经导入,键盘三个连键检测完成还剩最后一个连键的检测Work Item 38911:拍摄人物角色五付 浩Work Item 37741:游戏主模块 Work Item 3889…

出这样的题,出题人的良心确定不会痛吗?

全世界只有3.14 % 的人关注了爆炸吧知识“那些年,让我们气到吐血的题目。”数学篇

mysql怎么查看索引情况_mysql 查看索引使用情况

mysql 查看索引使用情况这是以读为主的线上库rootread 02:28:07>show status like ‘Handler_read%’;———————–——-| Variable_name | Value |———————–——-| Handler_read_first | 0 || Handler_read_key | 0 || Handler_read_ne…

iTextSharp应用,生成pdf

using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; public void PDF(string html) { Document dom new Document(); //创建文档 PdfWriter.GetInstance(dom, new FileStream(Server.MapPath("test") Guid.NewGuid() "…

python垃圾回收机制为什么标记能解决循环引用问题_Python 垃圾回收机制和如何解决循环引用...

引用计数:是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术, 当一个对象的引用被创建或者复制时,对象的引用计数加 1;当一个对象的引用被销毁时,对象的引用计数减 1;当对象的引用计…

Dapr + .NET 实战(十-终篇)K8S运行Dapr

工作原理为了实现在k8s上安装Dapr,Dapr需要部署dapr-sidecar-injector、dapr-operator、dapr-placement和dapr-sentry服务。 dapr-operator: 管理组件(state stores, pub/subs, etc.)dapr-sidecar-injector: 将 Dapr 注入 annotated pods,并添加环境变量…

mvc control 请求两次问题

今天在做项目时&#xff0c;突然发现一个mvc 的control中action被执行了两次&#xff0c;最终发现是由于favicon.ico导致的。问题代码&#xff1a; <link rel"shortcut icon" href"Images/wangyi.ico" type"image/x-icon" />,最终改成了 &…

双系统卸载

xp卸载vista 1,xp我的电脑右键&#xff0c;属性&#xff0c;磁盘管理。 2&#xff0c;右击vista磁盘&#xff0c;格式化&#xff0c;设在格式化选项&#xff0c;确定。 3&#xff0c;在运行了输入msconfig,确定。 4&#xff0c;在系统配置实用程序对话框中切换到boot.ini选项卡…

为什么老师批改完试卷,分数下要画两条横线?今天终于知道了!

全世界只有3.14 % 的人关注了爆炸吧知识总有考试分数下画两条横线的习惯&#xff0c;原来是这样形成的&#xff01;为什么老师改卷之后会在分数下画两条横线呢&#xff1f;你要去问老师&#xff1f;别问了&#xff0c;可能连老师都不知道……来看看这位当了老师的网友怎么说的&…

mysql数据库已连接数据库_001. 【已解决】Java连接MYSQL 数据库的连接步骤

这篇文章主要以MySQL为例讲下Java如何连接到数据库的。当然&#xff0c;首先要安装有JDK(一般是JDK1.5.X)。然后安装MySQL&#xff0c;这些都比较简单&#xff0c;具体过程就不说了。配置好这两个环境后&#xff0c;下载JDBC驱动mysql-connector-java-5.0.5.zip(这个是最新版的…

Windows 11 小技巧- WSL开启Linux桌面应用

WSL 经过⼏年的发展&#xff0c;已经是⼀个Windows下不少开发⼈员做云原⽣应⽤的必备环境&#xff0c;你可以在上⾯写各种语⾔&#xff0c;各种后端框架&#xff0c;也可以完成容器和k8s的部署&#xff0c;在Windows11下更进⼀步&#xff0c;直接⽀持Linux桌⾯应⽤&#xff0c;…

lcd屏幕抖动_电视屏幕面板大科普!买电视之前必看!

BOE知识酷 ?显示技术|显示资讯| PPT|知识管理第856篇推文导读&#xff1a;经常看到什么LCD、LED、OLED、ULED、QLED、SLED、GLED……之类的名词&#xff0c;花里胡哨。别看那么多名词&#xff0c;但从显示技术角度看&#xff0c;现在市场上主流的电视机其实就两种&#xff1a;…