一、分布式任务队列Celery介绍
Python celery是一个基于Python的分布式任务队列,主要用于任务的异步执行、定时调度和分布式处理。它采用了生产者/消费者模式,通过消息中间件实现多个工作者进程之间的协作。
Python celery的架构主要包括以下组件:
-
生产者:生产者是负责产生消息的对象。在Python celery中,生产者通常是应用程序本身。
-
消息中间件:消息中间件是负责存储和传输消息的组件。Python celery支持多种消息中间件,如RabbitMQ、Redis、AMQP等。
-
消费者:消费者是负责接收和处理消息的对象。在Python celery中,消费者通常是工作者进程。
-
任务调度器:任务调度器是负责定时调度任务的组件。在Python celery中,任务调度器通常是Celery Beat。
Python celery的工作流程如下:
-
应用程序通过调用celery的task函数来定义任务。
-
应用程序通过调用celery的send_task函数发送任务到消息队列。
-
工作者进程从消息队列中接收任务并进行处理。
-
工作者进程将任务结果发送回消息队列。
-
应用程序从消息队列中接收任务结果并进行处理。
通过Python celery,我们可以轻松实现分布式任务的处理和调度,提高系统的并发能力和稳定性。
二、Linux环境Celery安装部署
命令:pip3 install Celery
[root@localhost python]# pip3 install Celery
Collecting Celery
Downloading celery-5.1.2-py3-none-any.whl (401 kB)
|▉ | 10 kB 11.7 MB/s eta 0:00:0 |█▋ | 20 kB 13.9 MB/s eta 0:00:0 |██▌ | 30 kB 18.4 MB/s eta 0:00:0 |███▎ | 40 kB 595 kB/s eta 0:00:01 |████ | 51 kB 703 kB/s eta 0:00:01 |█████ | 61 kB 840 kB/s eta 0:00:01 |█████▊ | 71 kB 867 kB/s eta 0:00:01 |██████▌ | 81 kB 889 kB/s eta 0:00:01 |███████▍ | 92 kB 998 kB/s eta 0:00:01 |████████▏ | 102 kB 1.0 MB/s eta 0:00:0 |█████████ | 112 kB 1.0 MB/s eta 0:00:0 |█████████▉ | 122 kB 1.0 MB/s eta 0:00:0 |██████████▋ | 133 kB 1.0 MB/s eta 0:00:0 |███████████▍ | 143 kB 1.0 MB/s eta 0:00:0 |████████████▎ | 153 kB 1.0 MB/s eta 0:00:0 |█████████████ | 163 kB 1.0 MB/s eta 0:00:0 |█████████████▉ | 174 kB 1.0 MB/s eta 0:00:0 |██████████████▊ | 184 kB 1.0 MB/s eta 0:00:0 |███████████████▌ | 194 kB 1.0 MB/s eta 0:00:0 |████████████████▎ | 204 kB 1.0 MB/s eta 0:00:0 |█████████████████▏ | 215 kB 1.0 MB/s eta 0:00:0 |██████████████████ | 225 kB 1.0 MB/s eta 0:00:0 |██████████████████▊ | 235 kB 1.0 MB/s eta 0:00:0 |███████████████████▋ | 245 kB 1.0 MB/s eta 0:00:0 |████████████████████▍ | 256 kB 1.0 MB/s eta 0:00:0 |█████████████████████▏ | 266 kB 1.0 MB/s eta 0:00:0 |██████████████████████ | 276 kB 1.0 MB/s eta 0:00:0 |██████████████████████▉ | 286 kB 1.0 MB/s eta 0:00:0 |███████████████████████▋ | 296 kB 1.0 MB/s eta 0:00:0 |████████████████████████▌ | 307 kB 1.0 MB/s eta 0:00:0 |█████████████████████████▎ | 317 kB 1.0 MB/s eta 0:00:0 |██████████████████████████ | 327 kB 1.0 MB/s eta 0:00:0 |███████████████████████████ | 337 kB 1.0 MB/s eta 0:00:0 |███████████████████████████▊ | 348 kB 1.0 MB/s eta 0:00:0 |████████████████████████████▌ | 358 kB 1.0 MB/s eta 0:00:0 |█████████████████████████████▍ | 368 kB 1.0 MB/s eta 0:00:0 |██████████████████████████████▏ | 378 kB 1.0 MB/s eta 0:00:0 |███████████████████████████████ | 389 kB 1.0 MB/s eta 0:00:0 |███████████████████████████████▉| 399 kB 1.0 MB/s eta 0:00:0 |████████████████████████████████| 401 kB 1.0 MB/s
Collecting kombu<6.0,>=5.1.0
Downloading kombu-5.1.0-py3-none-any.whl (187 kB)
|█▊ | 10 kB 20.3 MB/s eta 0:00:0 |███▌ | 20 kB 33.1 MB/s eta 0:00:0 |█████▎ | 30 kB 46.0 MB/s eta 0:00:0 |███████ | 40 kB 3.4 MB/s eta 0:00:01 |████████▊ | 51 kB 4.0 MB/s eta 0:00:01 |██████████▌ | 61 kB 4.8 MB/s eta 0:00:01 |████████████▎ | 71 kB 5.5 MB/s eta 0:00:01 |██████████████ | 81 kB 6.2 MB/s eta 0:00:01 |███████████████▊ | 92 kB 6.9 MB/s eta 0:00:01 |█████████████████▌ | 102 kB 7.6 MB/s eta 0:00:0 |███████████████████▎ | 112 kB 7.6 MB/s eta 0:00:0 |█████████████████████ | 122 kB 7.6 MB/s eta 0:00:0 |██████████████████████▊ | 133 kB 7.6 MB/s eta 0:00:0 |████████████████████████▌ | 143 kB 7.6 MB/s eta 0:00:0 |██████████████████████████▎ | 153 kB 7.6 MB/s eta 0:00:0 |████████████████████████████ | 163 kB 7.6 MB/s eta 0:00:0 |█████████████████████████████▊ | 174 kB 7.6 MB/s eta 0:00:0 |███████████████████████████████▌| 184 kB 7.6 MB/s eta 0:00:0 |████████████████████████████████| 187 kB 7.6 MB/s
Collecting click-repl>=0.1.6
Downloading click_repl-0.3.0-py3-none-any.whl (10 kB)
Collecting click<8.0,>=7.0
Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
|████ | 10 kB 10.1 MB/s eta 0:00:0 |████████ | 20 kB 10.4 MB/s eta 0:00:0 |███████████▉ | 30 kB 14.1 MB/s eta 0:00:0 |███████████████▉ | 40 kB 7.7 MB/s eta 0:00:01 |███████████████████▉ | 51 kB 7.1 MB/s eta 0:00:01 |███████████████████████▊ | 61 kB 8.3 MB/s eta 0:00:01 |███████████████████████████▊ | 71 kB 7.2 MB/s eta 0:00:01 |███████████████████████████████▊| 81 kB 7.9 MB/s eta 0:00:01 |████████████████████████████████| 82 kB 2.7 MB/s
Collecting billiard<4.0,>=3.6.4.0
Downloading billiard-3.6.4.0-py3-none-any.whl (89 kB)
|███▋ | 10 kB 15.8 MB/s eta 0:00:0 |███████▎ | 20 kB 25.5 MB/s eta 0:00:0 |███████████ | 30 kB 34.6 MB/s eta 0:00:0 |██████████████▋ | 40 kB 42.9 MB/s eta 0:00:0 |██████████████████▎ | 51 kB 3.7 MB/s eta 0:00:01 |██████████████████████ | 61 kB 4.4 MB/s eta 0:00:01 |█████████████████████████▋ | 71 kB 5.0 MB/s eta 0:00:01 |█████████████████████████████▎ | 81 kB 5.7 MB/s eta 0:00:01 |████████████████████████████████| 89 kB 5.4 MB/s
Collecting click-plugins>=1.1.1
Downloading click_plugins-1.1.1-py2.py3-none-any.whl (7.5 kB)
Requirement already satisfied: setuptools in /usr/lib/python3.6/site-packages (from Celery) (39.2.0)
Collecting click-didyoumean>=0.0.3
Downloading click_didyoumean-0.3.0-py3-none-any.whl (2.7 kB)
Collecting vine<6.0,>=5.0.0
Downloading vine-5.0.0-py2.py3-none-any.whl (9.4 kB)
Collecting pytz>dev
Downloading pytz-2023.3-py2.py3-none-any.whl (502 kB)
|▋ | 10 kB 16.2 MB/s eta 0:00:0 |█▎ | 20 kB 22.3 MB/s eta 0:00:0 |██ | 30 kB 31.5 MB/s eta 0:00:0 |██▋ | 40 kB 39.2 MB/s eta 0:00:0 |███▎ | 51 kB 5.8 MB/s eta 0:00:01 |████ | 61 kB 6.7 MB/s eta 0:00:01 |████▋ | 71 kB 2.3 MB/s eta 0:00:01 |█████▏ | 81 kB 2.6 MB/s eta 0:00:01 |█████▉ | 92 kB 2.2 MB/s eta 0:00:01 |██████▌ | 102 kB 2.4 MB/s eta 0:00:0 |███████▏ | 112 kB 2.4 MB/s eta 0:00:0 |███████▉ | 122 kB 2.4 MB/s eta 0:00:0 |████████▌ | 133 kB 2.4 MB/s eta 0:00:0 |█████████▏ | 143 kB 2.4 MB/s eta 0:00:0 |█████████▉ | 153 kB 2.4 MB/s eta 0:00:0 |██████████▍ | 163 kB 2.4 MB/s eta 0:00:0 |███████████ | 174 kB 2.4 MB/s eta 0:00:0 |███████████▊ | 184 kB 2.4 MB/s eta 0:00:0 |████████████▍ | 194 kB 2.4 MB/s eta 0:00:0 |█████████████ | 204 kB 2.4 MB/s eta 0:00:0 |█████████████▊ | 215 kB 2.4 MB/s eta 0:00:0 |██████████████▍ | 225 kB 2.4 MB/s eta 0:00:0 |███████████████ | 235 kB 2.4 MB/s eta 0:00:0 |███████████████▋ | 245 kB 2.4 MB/s eta 0:00:0 |████████████████▎ | 256 kB 2.4 MB/s eta 0:00:0 |█████████████████ | 266 kB 2.4 MB/s eta 0:00:0 |█████████████████▋ | 276 kB 2.4 MB/s eta 0:00:0 |██████████████████▎ | 286 kB 2.4 MB/s eta 0:00:0 |███████████████████ | 296 kB 2.4 MB/s eta 0:00:0 |███████████████████▋ | 307 kB 2.4 MB/s eta 0:00:0 |████████████████████▏ | 317 kB 2.4 MB/s eta 0:00:0 |████████████████████▉ | 327 kB 2.4 MB/s eta 0:00:0 |█████████████████████▌ | 337 kB 2.4 MB/s eta 0:00:0 |██████████████████████▏ | 348 kB 2.4 MB/s eta 0:00:0 |██████████████████████▉ | 358 kB 2.4 MB/s eta 0:00:0 |███████████████████████▌ | 368 kB 2.4 MB/s eta 0:00:0 |████████████████████████▏ | 378 kB 2.4 MB/s eta 0:00:0 |████████████████████████▉ | 389 kB 2.4 MB/s eta 0:00:0 |█████████████████████████▍ | 399 kB 2.4 MB/s eta 0:00:0 |██████████████████████████ | 409 kB 2.4 MB/s eta 0:00:0 |██████████████████████████▊ | 419 kB 2.4 MB/s eta 0:00:0 |███████████████████████████▍ | 430 kB 2.4 MB/s eta 0:00:0 |████████████████████████████ | 440 kB 2.4 MB/s eta 0:00:0 |████████████████████████████▊ | 450 kB 2.4 MB/s eta 0:00:0 |█████████████████████████████▍ | 460 kB 2.4 MB/s eta 0:00:0 |██████████████████████████████ | 471 kB 2.4 MB/s eta 0:00:0 |██████████████████████████████▋ | 481 kB 2.4 MB/s eta 0:00:0 |███████████████████████████████▎| 491 kB 2.4 MB/s eta 0:00:0 |████████████████████████████████| 501 kB 2.4 MB/s eta 0:00:0 |████████████████████████████████| 502 kB 2.4 MB/s
Collecting prompt-toolkit>=3.0.36
Downloading prompt_toolkit-3.0.36-py3-none-any.whl (386 kB)
|▉ | 10 kB 34.5 MB/s eta 0:00:0 |█▊ | 20 kB 45.2 MB/s eta 0:00:0 |██▌ | 30 kB 58.9 MB/s eta 0:00:0 |███▍ | 40 kB 70.9 MB/s eta 0:00:0 |████▎ | 51 kB 81.3 MB/s eta 0:00:0 |█████ | 61 kB 91.3 MB/s eta 0:00:0 |██████ | 71 kB 99.3 MB/s eta 0:00:0 |██████▉ | 81 kB 105.8 MB/s eta 0:00: |███████▋ | 92 kB 113.0 MB/s eta 0:00: |████████▌ | 102 kB 118.8 MB/s eta 0:00 |█████████▎ | 112 kB 118.8 MB/s eta 0:00 |██████████▏ | 122 kB 118.8 MB/s eta 0:00 |███████████ | 133 kB 118.8 MB/s eta 0:00 |███████████▉ | 143 kB 118.8 MB/s eta 0:00 |████████████▊ | 153 kB 118.8 MB/s eta 0:00 |█████████████▋ | 163 kB 118.8 MB/s eta 0:00 |██████████████▍ | 174 kB 118.8 MB/s eta 0:00 |███████████████▎ | 184 kB 118.8 MB/s eta 0:00 |████████████████▏ | 194 kB 118.8 MB/s eta 0:00 |█████████████████ | 204 kB 118.8 MB/s eta 0:00 |█████████████████▉ | 215 kB 118.8 MB/s eta 0:00 |██████████████████▋ | 225 kB 118.8 MB/s eta 0:00 |███████████████████▌ | 235 kB 118.8 MB/s eta 0:00 |████████████████████▍ | 245 kB 118.8 MB/s eta 0:00 |█████████████████████▏ | 256 kB 118.8 MB/s eta 0:00 |██████████████████████ | 266 kB 118.8 MB/s eta 0:00 |███████████████████████ | 276 kB 118.8 MB/s eta 0:00 |███████████████████████▊ | 286 kB 118.8 MB/s eta 0:00 |████████████████████████▋ | 296 kB 118.8 MB/s eta 0:00 |█████████████████████████▍ | 307 kB 118.8 MB/s eta 0:00 |██████████████████████████▎ | 317 kB 118.8 MB/s eta 0:00 |███████████████████████████▏ | 327 kB 118.8 MB/s eta 0:00 |████████████████████████████ | 337 kB 118.8 MB/s eta 0:00 |████████████████████████████▉ | 348 kB 118.8 MB/s eta 0:00 |█████████████████████████████▊ | 358 kB 118.8 MB/s eta 0:00 |██████████████████████████████▌ | 368 kB 118.8 MB/s eta 0:00 |███████████████████████████████▍| 378 kB 118.8 MB/s eta 0:00 |████████████████████████████████| 386 kB 118.8 MB/s
Collecting cached-property
Downloading cached_property-1.5.2-py2.py3-none-any.whl (7.6 kB)
Collecting importlib-metadata>=0.18
Downloading importlib_metadata-4.8.3-py3-none-any.whl (17 kB)
Collecting amqp<6.0.0,>=5.0.6
Downloading amqp-5.1.1-py3-none-any.whl (50 kB)
|██████▌ | 10 kB 21.6 MB/s eta 0:00:0 |█████████████ | 20 kB 28.1 MB/s eta 0:00:0 |███████████████████▍ | 30 kB 36.1 MB/s eta 0:00:0 |█████████████████████████▉ | 40 kB 41.0 MB/s eta 0:00:0 |████████████████████████████████| 50 kB 11.9 MB/s
Collecting typing-extensions>=3.6.4
Downloading typing_extensions-4.1.1-py3-none-any.whl (26 kB)
Collecting zipp>=0.5
Downloading zipp-3.6.0-py3-none-any.whl (5.3 kB)
Collecting wcwidth
Downloading wcwidth-0.2.6-py2.py3-none-any.whl (29 kB)
Installing collected packages: zipp, wcwidth, vine, typing-extensions, prompt-toolkit, importlib-metadata, click, cached-property, amqp, pytz, kombu, click-repl, click-plugins, click-didyoumean, billiard, Celery
Successfully installed Celery-5.1.2 amqp-5.1.1 billiard-3.6.4.0 cached-property-1.5.2 click-7.1.2 click-didyoumean-0.3.0 click-plugins-1.1.1 click-repl-0.3.0 importlib-metadata-4.8.3 kombu-5.1.0 prompt-toolkit-3.0.36 pytz-2023.3 typing-extensions-4.1.1 vine-5.0.0 wcwidth-0.2.6 zipp-3.6.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
三、Python celery分布式任务架构的使用
以下是一个简单的例子,说明Python celery分布式任务架构如何使用:
首先,安装Celery和消息中间件,比如RabbitMQ或Redis。
然后,在Python应用程序中定义任务,例如:
from celery import Celery
app = Celery('tasks', backend='rpc://', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
在以上代码中,我们通过Celery创建了一个名为tasks的应用程序,并定义了一个名为add的任务,这个任务会将两个数字相加并返回结果。
接下来,在Python应用程序中调用任务,例如:
from tasks import add
result = add.delay(4, 5)
print(result.get())
在以上代码中,我们通过add.delay函数调用任务,并获取异步执行结果。
最后,在终端中启动工作者进程:
celery -A tasks worker --loglevel=info
在终端中启动Celery Beat(任务调度器):
celery -A tasks beat --loglevel=info
通过以上步骤,我们就可以使用Python celery分布式任务架构来处理任务了。其中,应用程序和工作者进程可以在不同的服务器上运行,通过消息中间件进行通信。