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:
-------------- [email protected] 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 [email protected]
如果不指定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

猜你喜欢

转载自blog.csdn.net/qq_15551663/article/details/88912828
今日推荐