Celery(三)实例Application

Celery必须实例化后才可以使用,实例称之为application或者简称app。实例是线程安全的,多个Celery实例(不同的配置、部件和任务)都可以在一个进程空间中运行。

创建一个最简单的app:

>>> from celery import Celery
>>> app = Celery()
>>> app
<Celery __main__ at 0x7f6be52d0cd0>

上述的app是一个运行在__main__模块中的Celery实例。

Main Name

Celery发送任务信息时,是不发送任何源代码的,只是发送要执行的任务名称,而每个worker都维持着一个任务名称到任务具体函数的映射,称之为任务注册。

所以每个任务task都要有一个独特的不重复名称,可以看下任务默认名称是如何生成的:

>>> @app.task
... def add(x, y):
...     return x + y
...
>>> add.name
u‘__main__.add‘

可见任务的名称是实例运行模块的名称加上任务函数的名称。

现在在py文件中创建一个app实例,tasks.py:

from celery import Celery
app = Celery()

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

if __name__ == ‘__main__‘:
    print add.name
    app.worker_main()

在shell中直接创建Celery实例、模块直接运行或者在命令行中运行模块,都是在main模块中运行的:

$ python tasks.py
__main__.add

而使用import导入模块的时候,main name为定义Celery实例模块的名称:

>>> from tasks import add
>>> add.name
u‘tasks.add‘

在main模块中运行是可以手动指定实例的Main name的:

>>> from celery import Celery
>>> app = Celery(‘tasks‘)
>>> app.main
‘tasks‘

任务的名称也可以指定:

>>> @app.task(name=‘sum-of-two-numbers‘)
>>> def add(x, y):
...     return x + y

>>> add.name
‘sum-of-two-numbers‘

Configuration

要为app实例添加配置有几种方式:

创建app实例时初始化:

app = Celery(‘tasks‘, backend=‘redis://localhost:6379/0‘,
    ┆   ┆   ┆broker=‘redis://localhost:6379/0‘)

使用app.conf属性设置:

app.conf.result_backend = ‘redis://localhost:6379/0‘
app.conf.broker_url = ‘redis://localhost:6379/0‘

update多个配置:

>>> app.conf.update(
...     enable_utc=True,
...     timezone=‘Asia/Shanghai‘,
...)

使用配置文件,在当前目录下或者python可以搜索到的目录下建立一个配置文件,保证可以import,celeryconfig.py :

result_backend = ‘redis://localhost:6379/0‘
broker_url = ‘redis://localhost:6379/0‘

然后:

app.config_from_object(‘celeryconfig‘)

可以测试一下配置文件是否有格式错误:

$ python -m celeryconfig

也可以建立一个配置类:

class Config:
    enable_utc = True
    timezone = ‘Europe/London‘

app.config_from_object(Config)

从环境变量中获取:

import os
from celery import Celery

#: Set default configuration module name
os.environ.setdefault(‘CELERY_CONFIG_MODULE‘, ‘celeryconfig‘)

app = Celery()
app.config_from_envvar(‘CELERY_CONFIG_MODULE‘)

查看配置:

>>> app.conf.humanize(with_defaults=False, censored=True)
>>> app.conf.table(with_defaults=False, censored=True)

第一条以字符串的形式返回,第二条以字典的形式返回。

with_defaults设置为True时可以查看默认的配置,censored设置为True可以过滤掉敏感信息,包括API, TOKEN, KEY, SECRET, PASS, SIGNATURE, DATABASE。

Laziness

app实例是延迟的,创建一个实例只会将app设置为current app,只有在真正需要的时候才会完成。

实例只有在调用app.finalize()方法或者访问app.tasks属性时才会完成。

Finalizing实例会复制apps之间可以共享的tasks,执行未确定的tasks装饰器,确定所有的tasks都绑定于current app。

app.task装饰器并不会真正的创建task任务,直到task被调用或者app finalize完成时才创建:

>>> from celery import Celery
>>> app = Celery()
>>> @app.task
... def add(x, y):
...     return x + y
...
>>> add.__evaluated__()
False
>>> repr(add)
‘<@task: __main__.add of __main__ at 0x7f6571694cd0>‘
>>> add.__evaluated__()
True

调用了task的__repr__方法后,task就被真正创建了。

Breaking the chain

当使用current app时,最好将其作为参数进行传递,称之为app chain,比较好的实践是:

class Scheduler(object):

    def __init__(self, app):
        self.app = app

而不要:

from celery import current_app

class Scheduler(object):

    def run(self):
        app = current_app

通用的的写法:

from celery.app import app_or_default

class Scheduler(object):
    def __init__(self, app=None):
        self.app = app_or_default(app)

开发时可以设置:

$ CELERY_TRACE_APP=1 celery worker -l info

当app chain断裂时会raise一个异常。

Abstract Tasks

使用app.task装饰器创建的任务都继承自Task类。

可以自定义:

from celery import Task

class DebugTask(Task):

    def __call__(self, *args, **kwargs):
        print(‘TASK STARTING: {0.name}[{0.request.id}]‘.format(self))
        return super(DebugTask, self).__call__(*args, **kwargs)

然后用base参数指定:

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

也可以使用app的Task参数修改:

>>> app.Task = DebugTask

  

时间: 2024-08-30 16:13:07

Celery(三)实例Application的相关文章

Android高级编程笔记(三)Application类简介

每次运行APP时,Application类都保持实例化状态.与Activity不同,配置改变不会导致应用程序重启.通过继承Application类,可以完成一下3项工作: · 对Android运行时广播的应用程序级事件做出相应. · 在应用程序组件之间传递对象. · 管理和维护多个应用程序组件使用的资源. 其中,后两项工作通过使用一个单态类能够更好地完成.Application的实现在本质上是单态的,并应作为单态实现,以便提供对其方法和成员变量的访问. 一.扩展和使用Application类 如

44. Python Celery多实例 定时任务

celery是一个分布式的任务调度模块,那么celery是如何和分布式挂钩呢? celery可以支持多台不同的计算机执行不同的任务或者相同的任务. 如果要说celery的分布式应用的话,就要提到celery的消息路由机制,提到AMQP协议. 具体可以查看AMQP文档详细了解. 简单理解: 可以有多个"消息队列"(message Queue),不同的消息可以指定发送给不同的Message Queue, 而这是通过Exchange来实现的,发送消息到"消息队列"中时,可

Celery初识及简单实例

Celery是一个"自带电池"的任务队列.易于使用,可以轻易入门,它遵照最佳实践设计,使产品可以扩展,或与其他语言集成,并且它自带了在生产环境中运行这样一个系统所需的工具和支持.本文介绍基础部分: 选择和安装消息传输方式(中间人). 安装Celery并创建一个任务 运行职程并调用任务 追踪任务在不同状态间的迁移,并检视返回值 一.选择中间人 Celery需要一个发送和接收消息的解决方案,其通常以独立服务形式出现,称为消息中间人. 可行的选择包括: RabbitMQ RabbitMQ功能

SpringBoot2.0.2 Application调用的三种方式

一.注解 @SpringBootApplication            点开查看源码是由多个注解合成的注解,其中主要的注解有:            @SpringBootConfiguration            @EnableAutoConfiguration            @ComponentScan 三个关键的注解:             @ComponentScan 自动扫描加载进来的包,-----------可以扫描自动加载的bean            @E

【FastDev4Android框架开发】实例解析之SwipeRefreshLayout+RecyclerView+CardView(三十五)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50087873 本文出自:[江清清的博客] (一).前言: 作为Android L开始,Google更新了新控件RecyclerView和CardView,这两个控件在之前的文章中已经做了详细介绍和使用,同时在前面还对下拉刷新组件SwipeRefreshLayout进行相关讲解.本来该专题不在更新了,正好昨天有一个群友问到了怎么样结合SwipeRefreshLayou

Celery(二)-----------------使用Celery的第二步

使用Celery的第一步是有意最小化的介绍Celery.本节教程将为你展示Celery提供的更多细节,包括怎样为你的程序和库添加Celery支持. 本节教程不会介绍Celery的所有特性和最佳实践,所以建议你也阅读一下用户指引 User Guide. 在你的程序中使用Celery 我们工程的结构如下: 布局: proj/__init__.py /celery.py /tasks.py proj/celery.py from __future__ import absolute_import, u

Python 并行分布式框架 Celery

Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分布式决定了可以有多个 worker 的存在,队列表示其是异步操作,即存在一个产生任务提出需求的工头,和一群等着被分配工作的码农. 在 Python 中定义 Celery 的时候,我们要引入 Broker,中文翻译过来就是"中间人"的意思,在这里 Broker 起到一个中间人的角色.在工头提

【转】Python 并行分布式框架 Celery

原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版:http://docs.jinkan.org/docs/celery/ celery配置:http://docs.jinkan.o

MySQL5.5多实例编译安装——多配置文件

一.什么是MySQL多实例?MySQL多实例简单的说就是在一台服务器上安装一套MySQL程序,通过不同的端口对外提供访问,多实例不仅节省物理主机成本,还有效提升了单台物理主机的CPU.磁盘I/O使用效率,而且还可以在多实例之间做部署数据库HA方案.二.如何配置MySQL多实例?配置mysql多实例有两种方式1.根据官方提供的是通过mysqld_multi使用单独的配置文件来实现多实例,这种方式定制每个实例的配置不太方面,优点是管理起来很方便,集中管理.2.使用多个配置文件和启动文件,配置文件之间