由於superviser不支持python3,而網上關於celery後臺運行的說明大都使用superviser,因此對於python3用戶celery後臺運行便成爲了一個問題。再沒廢話,直接上代碼。python
環境說明:redis
python3.6sql
django2.0.5數據庫
咱們使用redis的做爲celery任務隊列,有一個合成包能夠直接安裝二者一塊兒使用須要的安裝包django
直接在終端鍵入json
pip install celery-with-redis
就能夠安裝須要的依賴包了 app
構建項目過程略過,直接開始進行celery配置異步
咱們的項目名稱爲myproject,首先setting配置,添加函數
# celery settings # celery中間人 redis://redis服務所在的ip地址:端口/數據庫號 BROKER_URL = 'redis://localhost:6379/3' # celery結果返回,可用於跟蹤結果 CELERY_RESULT_BACKEND = 'redis://localhost:6379/3' # celery內容等消息的格式設置 CELERY_ACCEPT_CONTENT = ['application/json', ] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' # celery時區設置,使用settings中TIME_ZONE一樣的時區 CELERY_TIMEZONE = TIME_ZONE
而後在PATH/myproject/myproject/即setting的同級目錄下建立celery.py,初始化celery。url
from __future__ import absolute_import, unicode_literals from celery import Celery from django.conf import settings import os # 獲取當前文件夾名,即爲該Django的項目名 project_name = os.path.split(os.path.abspath('.'))[-1] project_settings = '%s.settings' % project_name # 設置環境變量 os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_settings) # 實例化Celery app = Celery(project_name) # 使用django的settings文件配置celery app.config_from_object('django.conf:settings') # Celery加載全部註冊的應用 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) #Celery加載全部註冊的應用 app.autodiscover_tasks(lambda:settings.INSTALLED_APPS)
這裏第一行輸入不能換位置,只能在首行,不然會報錯。
這裏的實例化celery的app咱們在別處要導入,爲了方便導入,咱們把它放到__init__.py裏,因此在/myproject/myproject/__init__.py咱們加入
from __future__ import absolute_import, unicode_literals # 引入celery實例對象 from .celery import app as celery_app
這樣同時也能告知django celery.py文件的存在。
咱們在項目根目錄下建立celery_tasks模塊,即在PATH/myproject/下建立該模塊,而後在該模塊下建立tasks.py,把咱們的耗時程序寫進去。
from myproject import celery_app import time @celery_app.task def time_consuming_fun(): for i in range(5): time.sleep(1) print(i) return 'ok'
直接用咱們的celery_app下的task方法裝飾須要進行異步處理的函數便可。
在view中調用,這裏用的是Django的類視圖。
from celery_tasks.tasks import time_consuming_fun from django.views import View from django.http import JsonResponse # Create your views here. class MyView(View): def get(self,request): #異步調用 time_consuming_fun.delay() #直接調用 #time_consuming_fun() return JsonResponse({'msg':'ok','code':200})
配置好url便可。
在項目根目錄下,即managy同級文件目錄下,輸入命令:
celery -A myproject worker -l info
此時celery在終端窗口運行,關閉終端celery就會中止。
輸入命令
celery multi start w1 -A myproject -l info --logfile = celerylog.log --pidfile = celerypid.pid
此時celery爲守護進程,日誌記錄在celerylog.log裏。
日誌文件能夠指定路徑PATH/celerylog.log,此時會在指定路徑下建立日誌文件。進程號文件相似。
中止或重啓將開始換爲stop或restart便可,因此需記錄w1,即需記錄woker的名稱來方便重啓和中止。