Celery學習--- Celery在項目中的使用


可以把celery配置成一個應用,注意連接文件命名必須為celery.py

目錄格式如下

image

項目前提: 安裝並啟動Redis

image

CeleryPro/celery.py   【命名必須為celery.py】

# 將相對路徑轉換為絕對路徑
from __future__ import absolute_import, unicode_literals
from celery import Celery
# 定義了一個Celery的App
app = Celery('tasks',
             # redis://:password@hostname:port/db_number  有密碼認證的連接
             broker='redis://192.168.2.105',
             # broker='redis://:密碼@192.168.2.105:6379/0',
             backend='redis://192.168.2.105',  # 用於Celery的返回結果的接收
             include=['CeleryPro.myTasks']       # 用於聲明Celery要執行的tasks任務的位置
             )
# Optional configuration, see the application user guide.
app.conf.update(
    result_expires=3600,   # Celery結果存在中間件Redis的超時時間[僅針對當前的Celery的App]
)
if __name__ == '__main__':
    app.start()

CeleryPro/myTasks.py

# 將相對路徑轉換為絕對路徑
from __future__ import absolute_import, unicode_literals
from .celery import app   # 從我的Celery中導入App

@app.task
def add(x, y):
    return x + y
@app.task
def mul(x, y):
    return x * y
@app.task
def xsum(numbers):
    return sum(numbers)

上傳文件到Linux服務器:

找到項目的文件夾,ALT+ P上傳

也可以打包為zip文件后上傳[unzip *.zip解壓]

image

項目啟動,推薦后台啟動:

【前台啟動不推薦】celery -A CeleryPro worker -loglevel=info  # 注意是項目名
【前台啟動簡寫】celery -A CeleryPro worker -l info 
【推薦啟動,后台啟動】 celery multi start w1 -A  CeleryPro -l info

image

image

運行結果:

omc@omc-virtual-machine:~$ python3
>>> from CeleryPro import mytasks
>>> myTasks.mul.delay(1,2)
<AsyncResult: f914b94d-0e92-40db-b174-f5d3f317a977>
>>> myTasks.add.delay(1,2)
<AsyncResult: 56b4369e-001e-4b27-831a-4e77aeb9da30>

image

關於AttributeError: module 'CeleryPro' has no attribute 'celery'報錯的解決:【耗時1.0H+】

image

問題解決:更改項目中myCelery.py文件為celery.py

問題總結:在項目中,celery的連接文件命名必須為celery,否則系統查找不到

后台啟動/停止多個Celery的worker

啟動命令:

前台啟動命令: celery -A 項目名worker -loglevel=info 

后台啟動命令: celery multi start w1 -A 項目名 -l info 

后台重啟命令: celery multi start w1 -A 項目名 -l info 

后台停止命令: celery multi stop w1 -A 項目名 -l info 

前后台的區別: 后台是mult啟動

注意:1. w1是worker的名稱,在啟動的時候已經設定好的

          這個跟單獨啟動時worker一樣,都是名稱而已

         2. 即便是所有的worker都已經done了,用戶任然啟動了任務,所有的任務都會保留,直到有worker來執行並返回結果。

         3. 如果前台的用戶請求[也就是沒有帶mult啟動的celery]斷開,則前台的worker任務也會消失。如果是帶mult啟動的celery,也就是后台啟動,斷開連接后后台的任務任然在。

后台啟動多個Celery的worker

啟動多個Celery的worker
omc@omc-virtual-machine:~/Celery$  celery multi start w1 -A CeleryPro -l info
celery multi v4.1.0 (latentcall)
> Starting nodes...
> w1@omc-virtual-machine: OK
omc@omc-virtual-machine:~/Celery$  celery multi start w2 -A CeleryPro -l info 
celery multi v4.1.0 (latentcall)
> Starting nodes...
> w2@omc-virtual-machine: OK
omc@omc-virtual-machine:~/Celery$  celery multi start w3 -A CeleryPro -l info 
celery multi v4.1.0 (latentcall)
> Starting nodes...
>w3@omc-virtual-machine:OK

image

重啟Celery的多個worker

omc@omc-virtual-machine:~/Celery$ celery multi restart w3 -A CeleryPro -l info
celery multi v4.1.0 (latentcall)
> Stopping nodes...
> w3@omc-virtual-machine: TERM -> 2152
> Waiting for 1 node -> 2152.....
> w3@omc-virtual-machine: OK
> Restarting node w3@omc-virtual-machine: OK
> Waiting for 1 node -> None...or stop it:

image

停止Celery的多個worker

omc@omc-virtual-machine:~/Celery$ celery multi stop w3 -A CeleryPro -l info       celery multi v4.1.0 (latentcall)
> Stopping nodes...
> w3@omc-virtual-machine: TERM -> 2168$ celery multi stopwait w1 -A proj -l info

image

查看當前還有多少個Celery的worker

omc@omc-virtual-machine:~$ ps -ef|grep celery

image

注意:個人感覺kill掉進程也是會干掉celery的進程的

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM