celery二

celery
选择并安装一个消息通道(RabbitMQ,Redis)
安装Celery并创建第一个任务(发布任务)
开始工作者并执行任务(使用celery命令创建工作者)
跟踪任务不同阶段的状态,并监视它们的返回值。
安装celery
pip install celery
redis配置
在redis配置文件修改
1.修改bind 0.0.0.0
2.protected-mode no
3.daemonize yes
4.在redis里config set requirepass 123 ->123是密码
5.重起redis服务

Celery,是一个消费者模型,本身不需要过多的操作。它有一个输入和一个输出,你需要将输入连接到一个中间人,如果需要还需要把输出连接到一个结果后台。
应用程序
首先你需要一个Celery实例,也可以简称为Celery应用程序或者"app"。这个app会作为Celery中所有工作的入口,比如创建任务,管理工作者。它必须能够被其它模块导入。
创建一个app
from celery import Celery
app = Celery('tasks', broker='amqp://guest@localhost//')
@app.task
def add(x, y):
    return x + y

 创建一个工作消费者:celery -A tasks worker --loglevel=info


调用任务
  可以通过使用delay()方法来调用我们的任务。
  这是一个调用apply_async()方法的便捷方法。它能够给我们对任务执行有更多的控制。

保存结果
  如果你想保存任务状态轨迹,Celery需要在某处保存或者发送这些状态,配置了结果后台,我们再次运行我们的任务。这样在你调用了任务之后,将能够获得一个AsyncResult实例。
  ready()方法将会返回这个实例,不管任务是正在运行还是已经运行结束。
  你也可以等待结果完成
  get()方法

配置
app.conf.task_serializer = 'json'
app.config_from_object('celeryconfig')
app.conf.update(
    task_serializer='json',
    accept_content=['json'],  # Ignore other content
    result_serializer='json',
    timezone='Europe/Oslo',
    enable_utc=True,
)

celeryconfig.py:

broker_url = 'amqp://'
result_backend = 'rpc://'

task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Europe/Oslo'
enable_utc = True


app实例
from __future__ import absolute_import, unicode_literals

from celery import Celery

app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

# Optional configuration, see the application user guide.
app.conf.update(
    result_expires=3600,
)

if __name__ == '__main__':
    app.start()

a.broker关键字参数指定了中间人所使用的URL
查看Choosing a Broker 获得更多信息
b.backend关键字参数指定了要使用的结果后台
用它来跟踪任务状态和结果。尽管默认情况下,结果选项被禁用。我这里还指明了backend是因为稍后我将展示怎样检索结果,你可能会在你的程序里使用其它的backend。
它们有各自的优势和劣势。如果你不需要结果你最好禁用它们。结果也可以被个别的任务禁用,通过在task装饰器中指定ignore_result选项( @task(ignore_result=True))
查看Keeping Results 获得更多的信息
c.include关键字参数是一个在worker启动时要导入的模块列表。在这里需要添加我们的tasks模块,这样worker启动时才能找到我们的task.
运行worker:celery -A tasks worker --loglevel=info

当worker启动时你应该可以看到如下信息:
When the worker starts you should see a banner and some messages:
-------------- celery@halcyon.local v4.0 (0today8)
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** --- . broker:      amqp://guest@localhost:5672//
- ** ---------- . app:         __main__:0x1012d8590
- ** ---------- . concurrency: 8 (processes)
- ** ---------- . events:      OFF (enable -E to monitor this worker)
- ** ----------
- *** --- * --- [Queues]
-- ******* ---- . celery:      exchange:celery(direct) binding:celery
--- ***** -----

--broker URL(transport)是我们在celery模块中指定的broker关键字参数,你也可以通过-b选项在命令行指定一个不同的broker.
--concurrency 是用来执行任务而prefork的worker进程,如果所有的worker都在执行任务,那么新添加的任务必须要等待有一个正在执行的任务完成后才能被执行。
默认的concurrency数量是机器上CPU的数量,你可以指定一个数量通过-c选项(celery worker -c )。在这里没有推荐值,因为最优值依懒许多因素,但是如果你的任务大部分都是I/O相关的,你可以尝试增加这个值,实验证明增加到2倍以上于CPU数的值对性能提高微乎其微,相反还会降低性能。
除了默认的进程池,Celery还支持使用Eventlet,Gevent和线程(查看 Concurrency)
--Events是一个选项,它可以用来使Celery在worker中有事件发生时发送监控消息(events)。这些信息可以被一些监控程序使用,比如celery events和Flower---一个实时的Celery monitor,更多详细介绍可以查看Monitoring and Management guide.
--Queuens是一个队列列表,workers将会从中消费任务。可以告诉worker一次性地从多个队列中消费任务,这可以用来路由消息给指定的worker。这对于构建高质量的服务,关系的分离和提供优先级都有意义。具体的描述参考Routing Guide.
你可以获得一个完整的命令行列表通过--help参数。

停止worker
可以简单的通过crtl+c来终止worker。worker可以接收的信号列表可以查看Workers Guide.

在后台运行
在生产环境中,你可能希望在后台运行worker.下面的文档中有详细的介绍:daemonization tutorial.


路由

Celery支持AMQP提供的所有路由机制,但是也支持将消息发送到命名队列的简单路由。

task_routes配置允许你通过名字来路由任务,还可以将所有的东西进行集中控制。


app.conf.update(
    task_routes = {
        'proj.tasks.add': {'queue': 'hipri'},
    },
)
你也可以在运行时通过queue关键字参数来为apply_async函数指定队列。

>>> from proj.tasks import add
>>> add.apply_async((2, 2), queue='hipri')
你可以通过指定celery worker -Q选项来让一个worker从队列中执行任务。

$ celery -A proj worker -Q hipri
你可以通过逗号分隔符来指定多个队列。比如,你可以指定worker从默认队列和“hipri”队列中执行任务,默认的工作队列由于历史原因名为'celery'。


$ celery -A proj worker -Q hipri,celery

远程控制

如果你正在使用RabbitMQ(AMQP),Redis或者MongoDB作为中间人,你可以在运行时控制和监视worker。

比如,你可以查看哪个任务正在被worker执行:


$ celery -A proj inspect active
这是通过广播消息实现的,所以所有的远程控制命令会被集群中的所有worker收到。
你还可以通过使用--destination选项来指定需要发送监控请求的workers所有的节点,所有的节点以逗号分隔。

$ celery -A proj inspect active --destination=celery@example.com
如果不指定destination,则所有的worker都会响应和回应广播请求。

celery inspect的相关所有命令并不会改变worker中的任何东西,它仅仅是请求关于正在运行的worker的信息和数据。要查看所有相关的命令,你可以执行:

$ celery -A proj inspect --help
还有一个celery control命令,它可以在运行时改变worker的相关内容:
$ celery -A proj control --help
比如,你可以强制worker使能事件消息(用于监控task和workers)
$ celery -A proj control enable_events
在事件机制开启的情况下,你可以开启事件dumper来观察workers正在干什么:
$ celery -A proj events --dump
或者你也开启curses接口:
$ celery -A proj events
当监控完成后,你可以去使能事件机制:
$ celery -A proj control disable_events
celery status命令也是使用远程控制命令,它会显示集群中在线的workers:
$ celery -A proj status

### 关于 Celery 的概述 Celery 是一种用于处理分布式任务队列的工具,能够高效管理大量任务并支持实时处理以及计划任务的功能[^1]。通过 Celery,开发者可以轻松实现异步任务调度和后台作业处理。 以下是关于如何安装、配置以及运行 Celery 的详细说明: --- #### 安装与环境准备 为了正确使用 Celery,首先需要确保 Python 虚拟环境已激活。如果遇到 `pip install` 后无法正常工作的情况,可能是因为未激活虚拟环境所致[^3]。因此,在安装之前,请先确认虚拟环境的状态,并按照如下方式操作: ```bash source /path/to/virtualenv/bin/activate pip install celery ``` --- #### 运行 Celery Worker 和 Beat 启动 Celery 工作节点时,通常会指定应用名称 (`-A`) 并设置日志级别 (`-l`) 等参数。例如以下命令展示了如何以特定主机名启动一个 Celery worker 实例[^2]: ```bash /usr/bin/python3.6 -m celery worker -A CeleryPro -l info \ --logfile=w2%I.log --pidfile=w2.pid --hostname=w2@Python3 ``` 此外,还可以配合其他组件一起部署完整的 Celery 生态系统,比如周期性任务调度器 (Beat) 及监控工具 (Flower): ```bash # 启动 Celery Beat celery -A your_project_name beat --loglevel=info # 启动 Flower 监控服务 celery -A your_project_name flower ``` --- #### 创建带进度跟踪的任务 当需要从前端展示后端任务执行进展时,可通过更新任务状态的方式实现动态反馈功能[^4]。下面是一个简单的例子演示了这一过程: ```python from celery import Celery import time import random app = Celery('tasks', broker='pyamqp://guest@localhost//') @app.task(bind=True) def long_task(self): """模拟长时间运行的任务""" verbs = ["Starting", "Booting", "Fixing"] adjectives = ["quick", "lazy", "smart"] nouns = ["cat", "dog", "fox"] total_steps = random.randint(5, 15) for step in range(total_steps): if not message or random.random() < 0.2: message = f"{random.choice(verbs)} {random.choice(adjectives)} {random.choice(nouns)}" self.update_state( state="PROGRESS", meta={"current": step, "total": total_steps, "status": message} ) time.sleep(1) return {"current": 100, "total": 100, "status": "Complete!", "result": True} ``` 调用此函数后可以从返回的结果对象中读取当前完成百分比以及其他附加信息。 --- ### 注意事项 在实际开发过程中需要注意几点常见问题及其解决方案: - **Broker连接失败**: 检查 RabbitMQ 或 Redis 是否正在运行。 - **Worker进程崩溃**: 查看对应worker的日志文件定位错误原因。 - **定时任务不触发**: 确认beat的服务已经开启并且配置无误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值