可以把celery配置成一個應用,注意連接文件命名必須為celery.py
目錄格式如下
項目前提: 安裝並啟動Redis
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解壓]
項目啟動,推薦后台啟動:
【前台啟動不推薦】celery -A CeleryPro worker -loglevel=info # 注意是項目名 【前台啟動簡寫】celery -A CeleryPro worker -l info 【推薦啟動,后台啟動】 celery multi start w1 -A CeleryPro -l info
運行結果:
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>
關於AttributeError: module 'CeleryPro' has no attribute 'celery'報錯的解決:【耗時1.0H+】
問題解決:更改項目中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
重啟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:
停止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
查看當前還有多少個Celery的worker
omc@omc-virtual-machine:~$ ps -ef|grep celery
注意:個人感覺kill掉進程也是會干掉celery的進程的