1、celery基本原理

Celery是一个由python编写的简单、灵活、可靠的用来处理大量信息的分布式系统,同时提供了操作和维护分布式系统所需要的工具,说白了就是一个用来管理分布式队列的工具。

Celery主要包含如下几个概念:

Brokers:存放/拿取任务的地方,常见的brokers有rabbitmq、redis、Zookeeper等;

Backend:结果储存的地方,队列中的任务运行完后的结果或者状态需要被任务发送者知道,那么就需要一个地方储存这些结果,常见的backend有redis、Memcached;

Workers:从队列中取出任务并执行;

Tasks:任务,一般由用户、触发器或其他操作将任务入队,然后交由workers进行处理。

基本框架图见下:

我们通常使用celery的命令来启动celery,启动的时候我们会指定一个celery实例,使用这个实例的task包装了的任务函数被包装成了celery的task对象,这样他们就有了delay方法。当我们执行delay方法时,这些task会找自己所属的那个celery instance,从中获取配置信息(主要是broker的地址)后将调用请求发往消息队列。

2、celery基本使用方式

快捷的任务启动函数delay

先看最基本使用方式,创建一个celery实例,指定redis的0号库和1号库为其broker和backend,创建一个最基本的用实例的task装饰的函数add。

再在另一个文件创建一个一个使用delay启动的异步任务,启动后,delay会向worker发消息申请执行任务,worker从broker获取已注册的task并根据入参执行,然后我们再根据ready函数从backend获取任务执行状态,执行完成后我们再从backend获取返回结果。

强大的任务启动函数apply_async

apply_async(args[,kwargs[, ...]])是celery真正的启动函数,delay是它的快捷版,apply_async可以指定更多的参数,第一部分就是task里面的python function的参数,比如add(x,y)的x,y,第二个参数叫作keyword arguments,就是设定一些环境变量,第三个参数就是execution options,也就是这个task本身的执行选项,下面介绍几个常用参数:

countdown:指定多少秒后执行任务;

eta (estimated time of arrival):指定任务被调度的具体时间,参数类型是datetime;

可以看到,时间貌似不对,其实是因为celery服务端运行使用的UTC时区,如果不指定utcnow就等不到执行时间了。

expires:任务过期时间,已开始的任务会被执行完成,未开始的不再执行,参数类型可以是float,也可以是datetime;

link(Signature):上一个任务返回成功才执行这个任务,相当于与一个回调,回调函数可以引用任务结果。

3、任务的排列组合

group:顺序的执行一组任务

chain:任务是可以被链接的,一个任务完成后,把结果传给另外一个任务,作为下一个任务的入参.

chords: 可以传入一个回调函数,等任务执行完,参数传给回调函数处理。

效果等同于group和chain的组合:

基于celery的任务管理的更多相关文章

  1. day102:MoFang:后端完成对短信验证码的校验&基于celery完成异步短信发送&flask_jwt_extended&用户登录的API接口

    目录 1.用户注册 1.后端完成对短信验证码的校验 2.基于celery实现短信异步发送 2.用户登录 1.jwt登录验证:flask_jwt_extended 2.服务端提供用户登录的API接口 1 ...

  2. 基于Celery在多台云服务器上实现分布式

    起源 最近参加公司里的一个比赛,比赛内容里有一项是尽量使用分布式实现项目.因为项目最终会跑在jetsonnano,一个贼卡的开发板,性能及其垃圾.而且要求使用python? 找了很多博客,讲的真的是模 ...

  3. Windows 环境下基于 Redis 的 Celery 任务调度模块的实现

    搭建环境: Windows-x64 10 Celery 3.1.23 Celery-with-redis 3.0 Redis-win32-win64 2.4.5   实现步骤: 1.安装 Redis ...

  4. Python 任务队列 Celery

    一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据 ...

  5. Odoo 中使用 celery 实现高性能异步任务队列

    详见:http://www.oejia.net/blog/2018/07/09/odoo_task_queue.html 概述 在 odoo 中可以用自带的cron实现异步任务,这个cron基于多线程 ...

  6. Django项目中使用celery做异步任务

    异步任务介绍 在写项目过程中经常会遇到一些耗时的任务, 比如:发送邮件.发送短信等等~.这些操作如果都同步执行耗时长对用户体验不友好,在这种情况下就可以把任务放在后台异步执行 celery就是用于处理 ...

  7. Celery入门指北

    Celery入门指北 其实本文就是我看完Celery的官方文档指南的读书笔记.然后由于我的懒,只看完了那些入门指南,原文地址:First Steps with Celery,Next Steps,Us ...

  8. windows下安装redis、celery,并启动测试

    Windows 环境下基于 Redis 的 Celery 任务调度模块的实现 搭建环境: Windows-x64 10 Celery 3.1.23 Celery-with-redis 3.0 Redi ...

  9. 异步任务分发模块Celery

    Celery简介 Celery是一个功能完备即插即用的任务队列.它使得我们不需要考虑复杂的问题,使用非常简单. celery适用异步处理问题,当遇到发送邮件.或者文件上传, 图像处理等等一些比较耗时的 ...

随机推荐

  1. RabbitMQ消费端自定义监听(九)

    场景: 我们一般在代码中编写while循环,进行consumer.nextDelivery方法进行获取下一条消息,然后进行消费处理. 实际环境: 我们使用自定义的Consumer更加的方便,解耦性更强 ...

  2. [CSP-S模拟测试]:骆驼(模拟+构造)

    题目描述 我们都熟悉走马步,现在我们定义一种新的移动方式——骆驼步,它在一个国际棋盘上的移动规则是这样的. 以看出,骆驼步可以向八个方向走动,且不能走出棋盘范围. 现在给出一个$N\times N$的 ...

  3. Handling Configuration Changes with Fragments

    This post addresses a common question that is frequently asked on StackOverflow: What is the best wa ...

  4. 前端面试题-HTML结构语义化

    一.HTML语义化的背景 HTML结构语义化,是近几年才提出来的,对比之前的 HTML 结构,大多是一堆没有语义的标签.用的最多的就是 DIV+CSS,为了改变这种现状,开发者们和官方提出了 HTML ...

  5. 北风设计模式课程---单一职责原则(Single Responsibility Principle)

    北风设计模式课程---单一职责原则(Single Responsibility Principle) 一.总结 一句话总结: 一个类应该有且只有一个变化的原因:单一职责原则(SRP:Single Re ...

  6. curl_init raw传递json参数

    protected function curl_vm_record($url, $platform, $authorization, $jsonStr) { $ch = curl_init(); cu ...

  7. C# 调Win32 API SendMessage简单用法及wMsg常量

    函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.该函数是应用程序和应用程序之间进行消息传递的主要手段之一.     函数原型:LRESU ...

  8. beyond compare 4.2.9桌面右键集成的问题修复

    beyond compare 4.2.9桌面右键集成的问题修复 安装后,发现在WIN64时,注册表中注册的DLL库有问题 出错处: [HKEY_CLASSES_ROOT\CLSID\{57FA2D12 ...

  9. pandas 基础介绍与概览

    pandas是 基于NumPy数组构建的,特别是基于数组的函数和不使用for循环的数据处理 相关联的几个库, 分析库 scikit-learn 和 statsmodels 数值计算工具,NumPy 可 ...

  10. Newtonsoft.Json源码中的C#预处理指令

    cs文件中包含以指令: #if !(NET35 || NET20 || PORTABLE40) 记事本打开[Newtonsoft.Json.Net20.csproj]可看到以下代码: <Defi ...