Celery(二)Celery执行异步、延迟和定时任务

celery执行异步任务

PS:特别需要注意创建工程的时候,实例化Celery所在的文件文件名称必须为celery.py,且包下有__init__.py文件,在实例化celery的时候必须将include参数添加正确

目录结构

study_celery				# 工程文件夹
	- proj					# proj包
		- __init__.py		# 必须要含有__init__.py
		- celery.py			# 名称必须为celery.py,在此处编写定时任务代码
		- tasks.py			# 任务文件,可以有多个
	- add_task1.py			# 添加任务到backend中,执行异步任务
	- add_task2.py			# 添加任务到backend中,执行延迟任务

proj/celery.py

from celery import Celery
from datetime import timedelta
from celery.schedules import crontab

broker = 'redis://:123456@10.0.0.100:6379/1'
backend = 'redis://:123456@10.0.0.100:6379/2'
app = Celery(__name__, broker=broker, backend=backend, include=['proj.tasks'])

app.conf.beat_schedule = {
    'low-task': {
        'task': 'proj.tasks.add',  # celery_task下的task1的add方法
        'schedule': timedelta(seconds=15),  # 每15秒执行1次
        # 'schedule': crontab(hour=8, day_of_week=2),  # 每周二早八点
        'args': (300, 150),  # add所需要的参数
    }
}

  1. 创建celery实例即app对象
  2. 执行存放任务broker地址和存放结果地址backend
  3. include参数是程序启动时倒入的模块列表,可以该处添加任务模块,便于worker能够对应相应的任务,列表中可以添加多个。
  4. 添加定时任务 beat

proj/tasks.py

from .celery import app

@app.task
def add(x, y):
    return x + y

@app.task
def mul(x, y):
    return x * y 
  1. 从celery中导入app对象
  2. 创建两个任务函数通过@app.task进行装饰

add_task1.py

from proj.tasks import add, mul

result = add.delay(1, 2)
result1 = mul.delay(8, 2)

print(result)
print(result1)

add_task2.py

from datetime import datetime, timedelta
from proj.tasks import add, mul

# 当前的utc时间向后延迟10s,默认使用utc时间
eta = datetime.utcnow() + timedelta(seconds=10)
# 10s后执行add和mul
ret1 = add.apply_async(args=(2, 3), eta=eta)
ret2 = mul.apply_async(args=(4, 5), eta=eta)
print(ret1)
print(ret2)

启动

# 需要cd到proj所在的目录下
# linux启动
celery -A proj worker -l info
# windows启动
celery -A proj worker -l info -P eventlet

---console---

User information: uid=0 euid=0 gid=0 egid=0

  uid=uid, euid=euid, gid=gid, egid=egid,
 
 -------------- celery@6ae5fd398c10 v5.2.3 (dawn-chorus)
--- ***** ----- 
-- ******* ---- Linux-3.10.0-1160.59.1.el7.x86_64-x86_64-with-debian-9.11 2022-03-31 08:55:46
- *** --- * --- 
- ** ---------- [config]
- ** ---------- .> app:         proj.celery:0x7f357cd743d0
- ** ---------- .> transport:   redis://:**@127.0.0.1:6379/1
- ** ---------- .> results:     redis://:**@127.0.0.1:6379/2
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery
                

[tasks]
  . proj.tasks.add
  . proj.tasks.mul

[2022-03-31 08:55:46,902: INFO/MainProcess] Connected to redis://:**@127.0.0.1:6379/1
[2022-03-31 08:55:46,904: INFO/MainProcess] mingle: searching for neighbors
[2022-03-31 08:55:47,914: INFO/MainProcess] mingle: all alone
[2022-03-31 08:55:47,925: INFO/MainProcess] celery@6ae5fd398c10 ready.


执行异步任务

# 需要cd到add_task1所在的目录下
python add_task.py


---console---
d6e5e56d-912f-40e6-b1ab-f08b1d59da98
af37bc9b-1cf9-43fe-87c4-fbd3f79d8066

---worker console---
[2022-03-31 08:58:09,033: INFO/MainProcess] Task proj.tasks.add[d6e5e56d-912f-40e6-b1ab-f08b1d59da98] received
[2022-03-31 08:58:09,048: INFO/MainProcess] Task proj.tasks.mul[af37bc9b-1cf9-43fe-87c4-fbd3f79d8066] received
[2022-03-31 08:58:09,061: INFO/ForkPoolWorker-1] Task proj.tasks.add[d6e5e56d-912f-40e6-b1ab-f08b1d59da98] succeeded in 0.02734477199999219s: 3
[2022-03-31 08:58:09,064: INFO/ForkPoolWorker-1] Task proj.tasks.mul[af37bc9b-1cf9-43fe-87c4-fbd3f79d8066] succeeded in 0.0013154429999531203s: 16

添加任务和worker先启动哪一个都可以,没有影响,当worker启动后,任务都会执行


执行延迟任务

# # 需要cd到add_task2.py所在的目录下
python add_task2.py

---console---
13e3a2ee-0bb5-4428-8a78-1fe29b499062
f68b434b-3957-466d-8294-5af66dfda468

此时worker所在的bash窗口等待片刻后输出

[2022-04-06 09:55:10,934: INFO/MainProcess] Task proj.tasks.add[13e3a2ee-0bb5-4428-8a78-1fe29b499062] received
[2022-04-06 09:55:10,956: INFO/MainProcess] Task proj.tasks.mul[f68b434b-3957-466d-8294-5af66dfda468] received
[2022-04-06 09:55:20,954: INFO/ForkPoolWorker-1] Task proj.tasks.mul[f68b434b-3957-466d-8294-5af66dfda468] succeeded in 0.005011890999867319s: 20
[2022-04-06 09:55:20,957: INFO/ForkPoolWorker-1] Task proj.tasks.add[13e3a2ee-0bb5-4428-8a78-1fe29b499062] succeeded in 0.0019722010001714807s: 5


执行定时任务

# 代码编写在proj/celery.py中
# worker启动后,新打开一个bash窗口输入
celery -A proj beat -l info 

---console---
celery beat v5.2.3 (dawn-chorus) is starting.
__    -    ... __   -        _
LocalTime -> 2022-04-06 09:58:22
Configuration ->
    . broker -> redis://:**@127.0.0.1:6379/1
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> celery.beat.PersistentScheduler
    . db -> celerybeat-schedule
    . logfile -> [stderr]@%INFO
    . maxinterval -> 5.00 minutes (300s)
[2022-04-06 09:58:22,686: INFO/MainProcess] beat: Starting...
[2022-04-06 09:58:22,696: INFO/MainProcess] Scheduler: Sending due task low-task (proj.tasks.add)
[2022-04-06 09:58:37,699: INFO/MainProcess] Scheduler: Sending due task low-task (proj.tasks.add)

此时看到,beat所在的bash窗口每隔15s调动一次任务
打开worker所在的任务窗口如下

[2022-04-06 09:58:22,704: INFO/MainProcess] Task proj.tasks.add[c8b26f6a-f29f-43cf-9555-cd8746cbfb21] received
[2022-04-06 09:58:22,706: INFO/ForkPoolWorker-1] Task proj.tasks.add[c8b26f6a-f29f-43cf-9555-cd8746cbfb21] succeeded in 0.0015727149998383538s: 450
[2022-04-06 09:58:37,704: INFO/MainProcess] Task proj.tasks.add[82a406dc-c310-4bbb-ba83-a7d73bb2ae5e] received
[2022-04-06 09:58:37,707: INFO/ForkPoolWorker-1] Task proj.tasks.add[82a406dc-c310-4bbb-ba83-a7d73bb2ae5e] succeeded in 0.0025173189997076406s: 450
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Celery是一个Python的分布式任务队列框架,它可以用来实现异步任务的调度与执行。使用Celery,你可以将耗时的任务放入任务队列中,然后由后台的工作进程异步执行,这样可以提高系统的并发能力和响应速度。 要使用Celery,首先需要安装Celery库。你可以使用pip命令进行安装: ``` pip install celery``` 接下来,你需要创建一个Celery实例,并定义任务函数。任务函数可以是任何可调用对象,通常是一个Python函数。例如,下面是一个简单的示例: ```pythonfrom celery import Celery# 创建Celery实例app = Celery('myapp', broker='redis://localhost:6379/0') # 定义任务函数@app.taskdef add(x, y): return x + y``` 在上面的示例中,我们创建了一个名为`myapp`的Celery实例,并指定了一个Redis作为消息代理(broker)。然后,我们定义了一个名为`add`的任务函数,使用`@app.task`装饰器来将其注册为Celery任务。 接下来,你可以使用`delay()`方法调用任务函数,将任务放入任务队列中异步执行: ```pythonresult = add.delay(4,6) ``` 在上面的示例中,我们使用`delay()`方法调用了`add`任务,并传递了两个参数4和6。这会将任务添加到Celery的任务队列中,并返回一个`AsyncResult`对象,你可以使用它来获取任务的执行结果。 当任务被放入任务队列后,你需要启动Celery的工作进程来执行任务。可以使用以下命令启动工作进程: ``` celery -A myapp worker --loglevel=info``` 上面的命令中,`-A`参数指定了Celery实例所在的模块(在这个例子中是`myapp`),`--loglevel=info`参数指定了日志级别为info。 这只是Celery的一些基本用法,还有很多其他功能和配置可以探索。你可以查阅Celery的官方文档来获取更多详细信息:https://docs.celeryproject.org/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呀儿呦丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值