使用celery之怎麼讓celery跑起來

2021-06-19 23:07:37 字數 2677 閱讀 3521

celery 官網幫助文件  

前言自從發了上次的文章使用celery之深入celery配置, 有一些網友再問我怎麼讓celery跑起來. 其實說來也是,celery在新手眼裡真的是比較重量級,不好懂,今天先讓他跑起來吧 本文大部分**和使用方法都可以在celery官網看到

我想要的效果

我想實現乙個定時任務, 每3個小時的12分啟動,假如是定時任務大概是這樣的:

選擇mq

使用訊息佇列其實就是為了給任務乙個時序,保證任務訊息不丟失,想想你的乙個任務是關乎公司核心業務,猶豫某種原因失敗或者丟失怎麼辦? celery就需要這個訊息的儲存,我這裡還是選擇rabbitmq mongodb,redis都無所謂 只是儲存的位置的問題. 選擇其他的工具沒有遠端控制和監控

寫法就是:

其中可以這樣解析

vhost是命名空間,就像**的子網域名稱,在這裡由於許可權控制我們需要先建立賬號和密碼

$ rabbitmqctl add_vhost myvhost

$ rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"

編寫tasks.py指令碼

def add(x, y):

return x + y

#### 簡單的使用

-a指定的就是任務的程式 tasks.py worker表示他是乙個執行任務角色. 後面的記錄日誌型別,預設是info

這個時候,你可以在當前目錄下使用python互動模式生成乙個任務

>>> add.delay(4, 4)

這個時候可以看見上面的日誌裡面多了一些訊息,然後裡面多了這個任務的資訊,比如下面這樣:

[2013-11-24 17:11:59,371: info/mainprocess] task tasks.add[f27994b0-3628-43a1-b136-540a360e3d64] succeeded in 0.00102571400021s: 8

可以看見你的任務被執行了

假如我使用python的包, 就像乙個應用,讓**結構化一些

proj

├── __init__.py

├── celery.py

└── tasks.py

from __future__ import absolute_import

from celery import celery

broker='amqp://myuser:mypassword@localhost:5672/vhost',

backend='amqp://',

include=['proj.tasks'])

if __name__ == '__main__':

上面的broker就是訊息儲存的位址 backend是儲存任務執**況的,比如正在執行,執行失敗, 已經執行結果. include表示執行的任務的**都放在哪個程式裡面,比如這裡的proj.tasks就是proj/tasks.py

from __future__ import absolute_import

def add(x, y):

return x + y

好吧 我們可以這樣啟動

proj 就是我們剛才應用的專案目錄

給我們的專案任務放到特定的佇列

可能你有很多的任務,但是你希望某些機器跑某些任務, 你可以希望有些任務優先順序比較高,而不希望 先進先出的等待. 那麼需要引入乙個佇列的問題. 也就是說在你的broker的訊息儲存裡面有一些佇列,他們並行執行,但是worker只從對應 的佇列裡面取任務.

我們要修改配置

from __future__ import absolute_import

from celery import celery

broker='amqp://myuser:mypassword@localhost:5672/vhost',

backend='amqp://',

include=['proj.tasks'])

celery_routes = ,},)

if __name__ == '__main__':

你會發現add這個函式任務被放在乙個叫做』hipri』的佇列裡面,想要執行那麼也需要改:

使用beat自動排程

想想吧. 目前還是互動模式去手動執行, 我們要是想crontab的定時生成和執行,那麼就是celery beat幹的事情

from datetime import timedelta

from celery import celery

broker='amqp://myuser:mypassword@localhost:5672/vhost',

backend='amqp://',

include=['proj.tasks'])

celery_routes = ,

},celerybeat_schedule = , },

)if __name__ == '__main__':

注意發現了乙個celerybeat_schedule,裡面的排程其實就是表示10秒生成一次,worker啟動方法一樣, 這裡啟動beat,他就是按時生成任務發到mq裡面,讓worker取走去執行

其實也可以在worker命令中加-b

剛才的celerybeat_schedule也可以使用crontab的風格,比如我說的沒3小時的12分就可以這樣:

celerybeat_schedule = ,}

python之celery簡單使用

參考 celery是乙個簡單 靈活和可靠的分布式任務處理系統。專注實時任務佇列,也支援任務排程。一 celery主要包括四個部分 1 任務排程者,2 中介軟體,傳遞任務 broker 常用的有redis rabbitmq 3 任務執行者 work 4 結果儲存 backend 儲存執行完成的結果,告...

Python之celery的簡介與使用

celery是乙個基於分布式訊息傳輸的非同步任務佇列,它專注於實時處理,同時也支援任務排程。它的執行單元為任務 task 利用多執行緒,如eventlet,gevent等,它們能被併發地執行在單個或多個職程伺服器 worker servers 上。任務能非同步執行 後台執行 或同步執行 等待任務完成...

深入Celery之使用佇列以及優先順序提高響應

多個佇列 celery預設使用的佇列名為celery預設繫結在direct交換機celery,可通過celery default queue celery default exchange celery default routing key等引數配置修改.usr bin env python co...