celery 使用


1.broker

2.基础案例

使用redis作为broker和brokend。

创建tasks.py

# tasks.py
di = 'redis://:****@localhost:6379/0'
app = Celery('tasks', backend=di, broker=di) @app.task
def add(x, y):
return x + y

运行:

celery -A tasks worker -l info -P eventlet

创建temp.py

# temp.py

from tasks import add

rv = add.delay(4, 4)

2.1 运行结果:

运行tasks

E:\python\code test>celery -A tasks worker -l info -P eventlet

 -------------- celery@*** v4.3.0 (rhubarb)
---- **** -----
--- * *** * -- Windows0 2019-09-21 22:08:04
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: tasks:0x1aebfdcf98
- ** ---------- .> transport: redis://:**@localhost:6379/0
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 4 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery [tasks]
. tasks.add [2019-09-21 22:08:04,802: INFO/MainProcess] Connected to redis://:**@192.168.199
.113:6379/0
[2019-09-21 22:08:04,813: INFO/MainProcess] mingle: searching for neighbors
[2019-09-21 22:08:05,849: INFO/MainProcess] mingle: all alone
[2019-09-21 22:08:05,886: INFO/MainProcess] celery@*** ready.
[2019-09-21 22:08:05,905: INFO/MainProcess] pidbox: Connected to redis://:**@...../0.

运行temp

[2019-09-21 22:11:27,198: INFO/MainProcess] Received task: tasks.add[06d745c6-53
18-4f48-8a1e-2ab8f8563994]
[2019-09-21 22:11:27,200: INFO/MainProcess] Task tasks.add[06d745c6-5318-4f48-8a
1e-2ab8f8563994] succeeded in 0.0s: 8
[2019-09-21 22:11:31,935: INFO/MainProcess] Received task: tasks.add[115c3b5d-eb
a7-472b-86ab-bd356f650e13]
[2019-09-21 22:11:31,936: INFO/MainProcess] Task tasks.add[115c3b5d-eba7-472b-86
ab-bd356f650e13] succeeded in 0.0s: 8

2.2 问题

在运行时出现两个问题:

  1. redis-py版本问题,目前为2.*,要求升级

    pip install --upgrade redis

    升级到4.***

  2. 报错ValueError: not enough values to unpack (expected 3, got 0)

    解决方法:

    看别人描述大概就是说win10上运行celery4.x就会出现这个问题,解决办法如下,原理未知:

    安装`eventlet

    pip install eventlet

    然后启动worker的时候加一个参数,如下:

    celery -A worker -l info -P eventlet

    然后就可以正常的调用了。

3.复杂一点的测试环境

一般而言,celery项目的代码分为三部分:

  1. worker定义
  2. tasks定义
  3. tasks添加

结构:

proj/__init__.py
/celery_worker.py # worker定义
/celery_tasks.py # tasks定义
/celery_run.py # 调用

proj/celery_worker.py

 # celery test -- worker
from celery import Celery di_broker = 'redis://:123@192.168.199.113:6379/0'
di_backend = 'redis://:123@192.168.199.113:6379/1' def create_worker():
# app = Celery('tasks', broker=di)
app = Celery('tasks',
backend=di_backend,
broker=di_broker,
include=['code_2.celery_tasks']) app.conf.update(result_expires=3600,)
return app app = create_worker() if __name__ == '__main__':
app.start()

proj/celery_tasks.py

from celery_worker import app

@app.task
def add(x, y):
return x + y @app.task
def mul(x, y):
return x * y @app.task
def xsum(numbers):
return sum(numbers)

proj/celery_run.py

# celery test
from celery_tasks import add
rv = add.delay(4, 4) out = rv.get(timeout=1)
print(out)
out = rv.ready()
print(out)

start the woker

celery -A celery_tasks worker -l info -P eventlet

stopping the woker

ctrl+c

实验环境搭建完成,下面测试复杂一点的功能。

4.calling tasks

接口

add(4, 4) # 本地调用

add.delay(4, 4) # worker执行

This method is actually a star-argument shortcut to another method called apply_async():

add.apply_async((2, 2))

可以使用更多参数

add.apply_async((2, 2), queue='lopri', countdown=10)

上句代表任务发送到lopri队列,至少等待10秒才执行

每个任务都会被赋与一个id

The delay and apply_async methods return an AsyncResult instance

如果指定了backend,可以查看任务的执行情况

res = add.delay(2, 2)

res.get(timeout=1)

4

You can find the task’s id by looking at the id attribute:

res.id

d6b3aea2-fb9b-4ebc-8da4-848818db9114

You can also inspect the exception and traceback if the task raised an exception, in fact result.get() will propagate any errors by default:

res = add.delay(2)

res.get(timeout=1)

If you don’t wish for the errors to propagate then you can disable that by passing the propagate argument:

res.get(propagate=False)

TypeError('add() takes exactly 2 arguments (1 given)',)

5.server/worker

5.1 基础讲解

(vir_venv) E:\python\code>celery -A celery_tasks worker -l info -P eventlet

 -------------- celery@** v4.3.0 (rhubarb)
---- **** -----
--- * *** * -- Windows-8.1-6.3. 2019-09-22 10:50:49
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: tasks:0x38ac527d30
- ** ---------- .> transport: redis://:**@***:6379/0
- ** ---------- .> results: redis://:**@***:6379/1
- *** --- * --- .> concurrency: 4 (eventlet) # 并发数
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery

这里使用eventlet代表每次任务都是在单独线程中执行。

task events参数决定是否监视worker

5.2 后台运行

celery multi start worker1 -A celery_worker -l info
celery multi restart w1 -A proj -l info
celery multi stop w1 -A proj -l info
# 等待执行完成
celery multi stopwait w1 -A proj -l info

6.task组合结构/工作流

task支持下面的方法:

add.signature((2, 2), countdown=10)
tasks.add(2, 2)
There’s also a shortcut using star arguments: add.s(2, 2)
tasks.add(2, 2) def func2():
r = add.s(2,2)
pr_type(r)
rv = r.delay()
out = rv.get(timeout=5)
print(out)
out = rv.ready()
print(out)

看起来它像partial,实质也是对tasks的一个封装,使用它的目的是为了构造更复杂的任务结构。

支持的组合结构如下:

group chain chord map starmap chunks

以group为例:

>>> g = group(add.s(i) for i in xrange(10))
>>> g(10).get()
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

celery 使用 - 3的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. celery使用的一些小坑和技巧(非从无到有的过程)

    纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...

  3. tornado+sqlalchemy+celery,数据库连接消耗在哪里

    随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知.     最近老是发现数据库的连接数如果 ...

  4. celery 框架

    转自:http://www.cnblogs.com/forward-wang/p/5970806.html 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据 ...

  5. celery使用方法

    1.celery4.0以上不支持windows,用pip安装celery 2.启动redis-server.exe服务 3.编辑运行celery_blog2.py !/usr/bin/python c ...

  6. Celery的实践指南

    http://www.cnblogs.com/ToDoToTry/p/5453149.html Celery的实践指南   Celery的实践指南 celery原理: celery实际上是实现了一个典 ...

  7. Using Celery with Djang

    This document describes the current stable version of Celery (4.0). For development docs, go here. F ...

  8. centos6u3 安装 celery 总结

    耗时大概6小时. 执行 pip install celery 之后, 在 mac 上 celery 可以正常运行, 在 centos 6u3 上报错如下: Traceback (most recent ...

  9. celery 异步任务小记

    这里有一篇写的不错的:http://www.jianshu.com/p/1840035cb510 自己的"格式化"后的内容备忘下: 我们总在说c10k的问题, 也做了不少优化, 然 ...

  10. Celery 框架学习笔记

    在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...

随机推荐

  1. 07 部署fastDFS文件数据库

    安装fastDFS前必须准备好两个版本匹配的文件: libfastcommon_V1.0.7.tar.gz:基础库文件 FastDFS_V5.05.tar.gz:文件数据库文件 注:这两个文件版本要匹 ...

  2. bzoj 1483

    Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input 第 ...

  3. Linux package installation: deb and rpm

    一般来说著名的 Linux 系统基本上分两大类: RedHat 系列:Redhat.Centos.Fedora 等 Debian 系列:Debian.Ubuntu 等 Dpkg (Debian系): ...

  4. cURL是什么

    原文链接:https://www.leiue.com/what-is-curl cURL 是一个利用 URL 语法在命令行下工作的文件传输工具,1997 年首次发行.它支持文件上传和下载,所以是综合传 ...

  5. Mysql高级操作

    多数据插入 insert into 表名 [(字段名)] values(值列表1),(值列表2),... 主键冲突 主键冲突更新 主键冲突时,更新数据 insert into 表名 [(字段列表)] ...

  6. php核心技术与最佳实践--- oop

    <?php /** * Created by PhpStorm. * User: cl * Date: 2019/8/12 * Time: 7:08 */ /*oop*/ class Perso ...

  7. Mysql主键外键操作

    外键: ·一对多 ·多对多 ·一对一 ·修改表 ·复制表   主键:   rimary key auto_increment(primary key是主键通常和auto_increment自动增加混合 ...

  8. ASP.NET + MVC5 入门完整教程八 -—-- 一个完整的应用程序(上)

    https://blog.csdn.net/qq_21419015/article/details/80509513 SportsStore 1.开始创建Visual Studio 解决方案和项目这里 ...

  9. 2020 CCPC比赛

    https://ac.nowcoder.com/acm/contest/4010/A 这道题枚举区间长度的贡献值: 当区间长度为1时,就是所有元音数的个数: 当区间长度为2时,区间[2,n-1]的数贡 ...

  10. 【PAT甲级】1113 Integer Set Partition (25分)

    题意: 输入一个正整数N(2<=N<=1e5),接着输入N个正整数,将这些数字划分为两个不相交的集合,使得他们的元素个数差绝对值最小且元素和差绝对值最大. AAAAAccepted cod ...