celery 的使用

知乎文章:
Celery 快速入門
某博客:
Celery 快速入門
周期任務(wù)
celery 分布式廣播通知
class based celery tasks
celery 官方總結(jié)的常見問題
celery有什么難理解的
記一次 celery 中的內(nèi)存泄露問題
自己的要求:必須精通celery 因為自已要用到( tm 在其他應(yīng)用里面 的 tasks 文件里面 @share_task 還是沒試成功, 老是報錯, 文章后面會提一下)

其實用 @app.task 吧,能解決大部分任務(wù)了,share_task 的在找一下原因
簡介:
Celery是一個簡單,靈活且可靠的分布式系統(tǒng),可以處理大量消息,同時為操作提供維護該系統(tǒng)所需的工具。

這是一個任務(wù)隊列,著重于實時處理,同時還支持任務(wù)調(diào)度

安裝redis的celery:

pip install -U "celery[redis]"

創(chuàng)建任務(wù)實例:

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0')
# broker 是你redis 的地址,默認使用 0 數(shù)據(jù)庫


@app.task
def send_mail(email):
    print("send mail to ", email)
    import time
    time.sleep(5)
    return "success"
# 函數(shù)用app.task 裝飾器修飾之后,就會成為Celery中的一個Task。

啟動任務(wù):
先啟動redis-server:

redis-server.exe
進入redis 安裝目錄寫,或者配置好全局變量后直接寫

運行一個任務(wù):

最好是進入模塊所在的目錄運行  其中tasks 是模塊名字
celery -A tasks worker --loglevel=info

要調(diào)用我們的任務(wù),您可以使用[delay()]
新啟動命令窗口,進到模塊目錄 :

from 模塊 import  任務(wù)函數(shù)
運行 funcname.delay([args..])
結(jié)果如下圖
執(zhí)行提示 窗口1

執(zhí)行結(jié)果 窗口2

調(diào)用周期任務(wù),必須先添加完整的定時表:

from celery import Celery
from celery.schedules import crontab

app = Celery()

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print(arg)

或者手動:

app.conf.beat_schedule = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}
app.conf.timezone = 'UTC'

啟動周期任務(wù):

celery -A tests beat

啟動worker 節(jié)點,運行任務(wù):

celery -A tests worker

上面的tests 都是寫任務(wù)那個模塊的名字
結(jié)果:


十秒一次的周期任務(wù)

目錄下 celery 的任務(wù)運行
[django 中使用celery]%E5%8A%A1/)

celery api 參考

我們項目大致使用celery 的思路:

pip install django_celery_beat
并且 注冊到 app :
django_celery_beat,

settings.py

# CELERY_RESULT_BACKEND = 'django-db'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False
DJANGO_CELERY_BEAT_TZ_AWARE = False  # fix bug https://github.com/celery/django-celery-beat/issues/109
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERYD_MAX_TASKS_PER_CHILD = 10

celery.py:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ops.settings')

app = Celery('ops',
             broker=broker)
app.config_from_object('django.conf:settings',  namespace='CELERY')
# 然后 就是settings 里面那些 配置了
# 最后來一句
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

使用celery 進行流量統(tǒng)計

啟動worker 報錯,不能找到其他文件夾模塊,原因參考

關(guān)于 share_task 和 task 的區(qū)別
簡單說就是 share_task 不需要綁定到具體的 celery app 實例, >@shared_task將為每個應(yīng)用程序創(chuàng)建任務(wù)的獨立實例,從而使任務(wù)可重用

這個就是說,你的 任務(wù)和 celery 應(yīng)用是解耦的。大概是這樣,
你的任務(wù)也可以直接在其他項目中使用。和本身dj 項目沒關(guān)系?

簡書的文章,翻譯的官方的celery 使用 django

顯示 @share_task 的任務(wù)未注冊

原來我 celery 里有個 配置順序?qū)戝e了,看了官方文檔特意強調(diào)了這個。我才認識到這個問題

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'transform_server.settings')

app = Celery('transform_server', broker="redis://:{passwd}@localhost:6379/0".format(passwd=encrypt_passwd))   # 1

app.config_from_object('django.conf:settings',  namespace='CELERY')  # 2

app.autodiscover_tasks()

os.environ.setdefault 這一句寫在 app 初始化之前。否則 其他的應(yīng)用的 tasks 注冊不了

看 celery 解釋
也許是讓 celery 在django 應(yīng)用都加載完畢,才生成 celery app , 我猜的
成功后的 顯示

(ps:改了task 的代碼,記得要重啟一下,celery 的服務(wù),不然用的還是老代碼)

在生產(chǎn)環(huán)境 就最好不要使用 celery -A 這種方式了, 因為這個是 開發(fā)調(diào)試用的.
生產(chǎn)推薦使用 supervisor

安裝 : 
1 pip install supervisor
參考: https://www.cnblogs.com/debochan/p/10823984.html

2 echo_supervisord_conf > supervisord.conf

3 supervisord.conf  在最后一行添加內(nèi)容:

[program:celery]
#Set full path to celery program if using virtualenv
command=celery -A worker transform_server --loglevel=INFO   # -A 在前面 worker 在后面
directory=/usr/src/transform_server
# environment=CELERY_CONFIG_MODULE="celerytask.celeryconfig-dev"

numprocs=1 ;進程數(shù)
autostart=true ;當(dāng)supervisor啟動時,程序?qū)詣訂?autorestart=true ;自動重啟

4 啟動supervisor:
supervisord -c supervisord.conf

5 關(guān)閉supervisord
supervisorctl -c supervisord.conf shutdown

6.重啟supervisord
supervisorctl -c supervisord.conf reload

supervisor 日志配置文件 默認在 /tmp/supervisord.log 目錄

注意 由于celery 啟動 并不是和 服務(wù)一起的,他是兩個進程的服務(wù),所以不要像,用 celery 改變當(dāng)前服務(wù)的內(nèi)存方面的東西,比如我想 直接在任務(wù)函數(shù)里面修改 server 程序的 類屬性,就不會生效的, celery 能做的就是 除了進城之外的,還是哪個話題,進城通信, 而且是不同機器的,只能通過數(shù)據(jù)庫,等持久化的中間層了。或者通過 request 請求。
關(guān)于 request 請求更改服務(wù)進城的屬性,已經(jīng)驗證過了,是會影響當(dāng)前進城的其他地方的是使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內(nèi)容