W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
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 提交到了 Python Package Index (PyPI),所以可以通過標(biāo)準(zhǔn) Python 工具 pip 或 easy_install 安裝:
$ pip install 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
現(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)用所在包或模塊。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: