成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Celery用戶指南中文翻譯-Application

sunnyxd / 2110人閱讀

摘要:在使用前必須實例化,稱為或。在中發(fā)送消息時,該消息僅包含要執(zhí)行的的名稱。每一個維護(hù)一個名稱和對應(yīng)函數(shù)的映射,這稱為。雖然可以依賴于當(dāng)前應(yīng)用,但最佳實踐是將應(yīng)用實例傳遞給任何需要它的對象,這個行為可以稱為。

Celery在使用前必須實例化,稱為application或app。app是線程安全的,具有不同配置、組件、task的多個Celery應(yīng)用可以共存于同一個進(jìn)程空間。

# 創(chuàng)建Celery應(yīng)用
>>> from celery import Celery
>>> app = Celery()
>>> app

最后一行文本化顯示了Celery應(yīng)用:包含應(yīng)用所屬類的名稱,當(dāng)前主模塊名,以及內(nèi)存地址。唯一重要的信息是模塊名稱。

Main Name

在Celery中發(fā)送task消息時,該消息僅包含要執(zhí)行的task的名稱。每一個worker維護(hù)一個task名稱和對應(yīng)函數(shù)的映射,這稱為task registry

當(dāng)定義一個task時,該task將注冊到本地:

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

>>> add
<@task: __main__.add>

>>> add.name
__main__.add

>>> app.tasks["__main__.add"]
<@task: __main__.add>

當(dāng)Celery無法檢測task函數(shù)屬于哪個模塊時,使用main模塊名生成初始task名稱。

這種方式僅適用于以下兩種場景:

定義task的模塊作為程序運(yùn)行

app在python shell中創(chuàng)建

# tasks.py
from celery import Celery
app = Celery()

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

if __name__ == "__main__":
    app.worker_main()

如果直接運(yùn)行tasks.py,task名將以__main__為前綴,但如果tasks.py被其他程序?qū)?,task名將以tasks為前綴。如下:

>>> from tasks import add
>>> add.name
tasks.add

也可以直接指定主模塊名:

>>> app = Celery("tasks")
>>> app.main
"tasks"

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

>>> add.name
tasks.add
Configuration

可以通過直接設(shè)置,或使用專用配置模塊對Celery進(jìn)行配置。

通過app.conf屬性查看或直接設(shè)置配置:

>>> app.conf.timezone
"Europe/London"

>>> app.conf.enable_utc = True

或用app.conf.update方法一次更新多個配置:

>>> app.conf.update(
...     enable_utc=True,
...     timezone="Europe/London",
...)
config_from_object

app.config_from_object()方法從配置模塊或?qū)ο笾袑?dǎo)入配置。需要注意的是:調(diào)用config_from_object()方法將重置在這之前配置的任何設(shè)置。

使用模塊名
app.config_from_object()方法接收python模塊的完全限定名(fully qualified name)或具體到其中的某個屬性名,例如"celeryconfig", "myproj.config.celery", 或"myproj.config:CeleryConfig":

from celery import Celery

app = Celery()
app.config_from_object("celeryconfig")

只要能夠正常執(zhí)行import celeryconfig,app就能正常配置。

使用模塊對象
也可以傳入一個已導(dǎo)入的模塊對象,但不建議這樣做。

import celeryconfig

from celery import Celery

app = Celery()
app.config_from_object(celeryconfig)

更推薦使用模塊名的方式,因為這樣在使用prefork pool時不需要序列化該模塊。如果在實際應(yīng)用中出現(xiàn)配置問題或序列化錯誤,請嘗試使用模塊名的方式。

使用配置類或?qū)ο?/strong>

from celery import Celery

app = Celery()

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

app.config_from_object(Config)
config_from_envvar

app.config_from_envvar()方法從環(huán)境變量中接收配置模塊名。

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")

通過環(huán)境變量指定配置模塊:

$ CELERY_CONFIG_MODULE="celeryconfig.prod" celery worker -l info
Censored configuration

如果要顯示Celery配置,可能需要過濾某些敏感信息如密碼、密鑰等。Celery提供了幾種用于幫助顯示配置的實用方法。

humanize()
該方法按行返回字符串形式的配置,默認(rèn)只包含改動過的配置,如果要顯示內(nèi)置的默認(rèn)配置,設(shè)置with_defaults參數(shù)為True:

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

table()
該方法返回字典形式的配置:

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

Celery不會移除所有的敏感信息,因為它使用正則表達(dá)式匹配鍵并判斷是否移除。如果用戶添加了包含敏感信息的自定義配置,可以使用Celery可能標(biāo)記為敏感配置的名稱來命名(API, TOKEN, KEY, SECRET, PASS, SIGNATURE, DATABASE)。

Laziness

應(yīng)用實例是惰性的。

創(chuàng)建Celery實例只會執(zhí)行以下操作:

創(chuàng)建用于event的logical clock instance

創(chuàng)建task registry

設(shè)置為當(dāng)前應(yīng)用(除非禁用了set_as_current參數(shù))

調(diào)用app.on_init()回調(diào)函數(shù)(默認(rèn)不執(zhí)行任何操作)

app.task()裝飾器不會在task定義時立即創(chuàng)建task,而是在task使用時或finalized應(yīng)用后創(chuàng)建。

下例說明了在使用task或訪問其屬性前,都不會創(chuàng)建task:

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

>>> type(add)


>>> add.__evaluated__()
False

>>> add        # <-- causes repr(add) to happen
<@task: __main__.add>

>>> add.__evaluated__()
True

應(yīng)用的Finalization指顯式地調(diào)用app.finalize()方法或隱式地訪問app.tasks屬性。

finalized應(yīng)用將會:

復(fù)制必須在應(yīng)用間共享的task。task默認(rèn)是共享的,但如果禁用了task裝飾器的shared屬性,將屬于應(yīng)用私有。

評估所有待處理的task裝飾器

確保所有task綁定到當(dāng)前應(yīng)用。將task綁定到某個應(yīng)用,以便可以從配置中讀取默認(rèn)值。

Breaking the chain

雖然可以依賴于當(dāng)前應(yīng)用,但最佳實踐是將應(yīng)用實例傳遞給任何需要它的對象,這個行為可以稱為app chain

# 依賴于當(dāng)前應(yīng)用(bad)

from celery import current_app

class Scheduler(object):

    def run(self):
        app = current_app
# 傳遞應(yīng)用實例(good)

class Scheduler(object):

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

在開發(fā)模式設(shè)置CELERY_TRACE_APP環(huán)境變量,可以在應(yīng)用鏈斷開時拋出異常:

$ CELERY_TRACE_APP=1 celery worker -l info
Abstract Tasks

使用task()裝飾器創(chuàng)建的task都繼承自celery.app.task模塊的Task基類。繼承該類可以自定義task類:

from celery import Task
# 或者 from celery.app.task 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)

如果要重寫__call__()方法,記得調(diào)用super。這樣在task直接調(diào)用時會執(zhí)行基類的默認(rèn)事件。

Task基類是特殊的,因為它并未綁定到任何特定的應(yīng)用。一旦task綁定到應(yīng)用,它將讀取配置以設(shè)置默認(rèn)值等。

通過base參數(shù)指定基類

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

通過app.Task屬性指定基類

>>> from celery import Celery, Task

>>> app = Celery()

>>> class MyBaseTask(Task):
...    queue = "hipri"

>>> app.Task = MyBaseTask
>>> app.Task


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

>>> add
<@task: __main__.add>

>>> add.__class__.mro()
[>,
 ,
 ,
 ]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43221.html

相關(guān)文章

  • Celery中使用Flask的上下文

    摘要:所以這就現(xiàn)實了在中使用的應(yīng)用上下文。要引入請求上下文,需要考慮這兩個問題如何在中產(chǎn)生請求上下文。中有和可以產(chǎn)生請求上下文。具體的思路還是在中重載類,通過,在的上下文環(huán)境下執(zhí)行。將他們傳入,生成偽造的請求上下文可以覆蓋大多數(shù)的使用情況。 其實我只是想把郵件發(fā)送這個動作移到Celery中執(zhí)行。既然用到了Celery,那么每次發(fā)郵件都單獨(dú)開一個線程似乎有點多余,異步任務(wù)還是交給Celery吧...

    Sourcelink 評論0 收藏0
  • Flask+Celery+Redis實現(xiàn)隊列化異步任務(wù)

    摘要:使用異步框架,例如等等,裝飾異步任務(wù)。它是一個專注于實時處理的任務(wù)隊列,同時也支持任務(wù)調(diào)度。不存儲任務(wù)狀態(tài)。標(biāo)識要使用的默認(rèn)序列化方法的字符串。指定該任務(wù)的結(jié)果存儲后端用于此任務(wù)。 概述: ????????我們考慮一個場景,公司有一個需求,現(xiàn)在需要做一套web系統(tǒng),而這套系統(tǒng)某些功能需要使用...

    Ali_ 評論0 收藏0
  • django開發(fā)-django和tornado的不同

    摘要:中常用的幾個框架有等,今天來總結(jié)一下和的不同。本文使用的環(huán)境是。文件可以加載路由信息和項目配置信息,文件負(fù)責(zé)啟動項目。以上就簡單的比較了和幾個方面的不同,它們各有優(yōu)缺點,實際工作中可以根據(jù)不同的需求選擇不同的框架進(jìn)行開發(fā)。 python中常用的幾個web框架有django, tornado, flask等,今天來總結(jié)一下django和tornado的不同。工作中django和torna...

    Reducto 評論0 收藏0
  • 基于Flask-Angular的項目組網(wǎng)架構(gòu)與部署

    摘要:基于網(wǎng),分享項目的組網(wǎng)架構(gòu)和部署。項目組網(wǎng)架構(gòu)架構(gòu)說明流項目訪問分為兩個流,通過分兩個端口暴露給外部使用數(shù)據(jù)流用戶訪問網(wǎng)站。通過進(jìn)行配置,使用作為異步隊列來存儲任務(wù),并將處理結(jié)果存儲在中。 基于Raindrop網(wǎng),分享項目的組網(wǎng)架構(gòu)和部署。 項目組網(wǎng)架構(gòu) showImg(https://cloud.githubusercontent.com/assets/7239657/1015704...

    kelvinlee 評論0 收藏0
  • tornado配合celery及rabbitmq實現(xiàn)web request異步非阻塞

    摘要:主要是為了實現(xiàn)系統(tǒng)之間的雙向解耦而實現(xiàn)的。問題及優(yōu)化隊列過長問題使用上述方案的異步非阻塞可能會依賴于的任務(wù)隊列長度,若隊列中的任務(wù)過多,則可能導(dǎo)致長時間等待,降低效率。 Tornado和Celery介紹 1.Tornado Tornado是一個用python編寫的一個強(qiáng)大的、可擴(kuò)展的異步HTTP服務(wù)器,同時也是一個web開發(fā)框架。tornado是一個非阻塞式web服務(wù)器,其速度相當(dāng)快。...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

sunnyxd

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<