Flask 基于 Celery 的后臺任務(wù)

2021-08-11 10:34 更新

Celery 是一個(gè) Python 的任務(wù)隊(duì)列,包含線程/進(jìn)程池。曾經(jīng)有一個(gè) Flask 的集成, 但在 Celery 3 重構(gòu)了內(nèi)部細(xì)節(jié)后變得不必要了。本指導(dǎo)補(bǔ)充了如何妥善在 Flask 中使用 Celery 的空白,但假設(shè)你已經(jīng)讀過了 Celery 官方文檔中的教程 使用 Celery 的首要步驟

安裝 Celery

Celery 提交到了 Python Package Index (PyPI),所以可以通過標(biāo)準(zhǔn) Python 工具 pipeasy_install 安裝:

$ pip install celery

配置 Celery

你需要的第一個(gè)東西是一個(gè) Celery 實(shí)例,稱為 Celery 應(yīng)用。僅就 Celery 而言 其與 Flask 中的 Flask 對象有異曲同工之妙。因?yàn)檫@個(gè)實(shí)例用 于你在 Celery 中做任何事——諸如創(chuàng)建任務(wù)和管理職程(Worker)——的入口點(diǎn), 它必須可以在其它模塊中導(dǎo)入。

例如,你可以把它放置到 tasks 模塊中。雖然你可以在不重新配置 Flask 的 情況下使用 Celery,但繼承任務(wù)、添加對 Flask 應(yīng)用上下文的支持以及關(guān)聯(lián) Flask 配置會讓情況變得更好。

這就是把 Celery 集成到 Flask 的全部必要步驟:

from celery import Celery

def make_celery(app):
    celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    TaskBase = celery.Task
    class ContextTask(TaskBase):
        abstract = True
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)
    celery.Task = ContextTask
    return celery

該函數(shù)創(chuàng)建一個(gè)新的 Celery 對象,并用應(yīng)用配置來配置中間人(Broker), 用 Flask 配置更新其余的 Celery 配置,之后在應(yīng)用上下文中創(chuàng)建一個(gè)封裝任務(wù) 執(zhí)行的任務(wù)子類。

最簡示例

通過上面的步驟,下面即是在 Flask 中使用 Celery 的最簡示例:

from flask import Flask

app = Flask(__name__)
app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379',
    CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(app)


@celery.task()
def add_together(a, b):
    return a + b

這項(xiàng)任務(wù)可以在后臺調(diào)用:

>>> result = add_together.delay(23, 42)
>>> result.wait()
65

運(yùn)行 Celery 職程

現(xiàn)在如果你行動迅速,已經(jīng)執(zhí)行過了上述的代碼,你會失望地得知 .wait() 永遠(yuǎn)不會實(shí)際地返回。這是因?yàn)槟阋残枰\(yùn)行 Celery。你可以這樣把 Celery 以職程運(yùn)行:

$ celery -A your_application worker

your_application 字符串需要指向創(chuàng)建 celery 對象的應(yīng)用所在包或模塊。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號