# -*- coding: utf-8 -*- # __author__ = "maple" """""" # 1.請問 flask或django 項目在只有 一個進程一個線程的狀況下,不少請求同時到來.每一個請求服務端須要處理2分鐘.如何解決? # 2. celery是什麼? """ celery是一個基於Python實現的模塊,模塊能夠幫助咱們實現"任務管理". """ # 3.什麼狀況下使用celery? """ 一個請求的處理時間特別長,能夠使用celery. """ # 4. 安裝celery """ pip3 install celery """ # 5. 依賴redis作消息隊列(存聽任務可記過) # 6. 快速使用celery """ a.建立s1.py import time from celery import Celery app = Celery('tasks', broker='redis://123@123.207.56.67:6380', backend='redis://123@192.168.19.123:6379') @app.task def xxxxxx(x, y): time.sleep(10) return x + y b.啓動worker 進入當前目錄 celery worker -A s1 -l info celery worker -A s1 -l info -P eventlet (不推薦) c.建立任務 import s1 result = s1.xxxxxx.delay(88,671) print(result.id) d. 檢查任務 import s1 from celery.result import AsyncResult ret = AsyncResult(id='90a2a6e8-299a-41a5-9aab-4c989f45d303',app=s1.app) if ret.successful(): data = ret.get() print(data) """ # 7. 注意事項 """ - 解釋器版本和celery版本 - windows和linux - broker: - redis - rabbitMQ """ # 8. flask示例: flask12306 """ 問題: 1. 多任務結構目錄劃分 2. 定時任務 - 一次性 - 週期性 3. django示例 參考:https://www.cnblogs.com/wupeiqi/articles/8796552.html?tdsourcetag=s_pcqq_aiomsg """ # 9. 非週期性的定時任務: 示例見 demo3 """ import datetime import s1 # 使用 # 方式一 ctime = datetime.datetime.now() utc_ctime = datetime.datetime.utcfromtimestamp(ctime.timestamp()) eta_utc_time = utc_ctime + datetime.timedelta(seconds=5) # 方式二: #ctime = 數據庫獲取DateTime(2019-11-11) #eta_utc_time = datetime.datetime.utcfromtimestamp(ctime.timestamp()) result = s1.xxxxxx.apply_async(args=[1, 3], eta=eta_utc_time) # eta是執行時間(UTC時間) print(result.id) """ # 10. 週期性: 示例見 demo4 """ 1. 啓動worker (執行任務的進程) celery worker -A s1 -l info -P eventlet 2. 啓動建立任務的進程 celery beat -A s1 -l info 擴展: 週期性定時任務能夠使用celery + linux crontab服務實現. """ import time from celery import Celery app = Celery('tasks', broker='redis://127.0.0.1:6379', backend='redis://127.0.0.1:6379') @app.task def xxxxxx(x, y): time.sleep(1) return x + y app.conf.beat_schedule = { 'adfasdfasdf': { 'task': 's1.xxxxxx', 'schedule': 5, 'args': (2, 16) }, } # 11. django中使用celery """ 1. 在project同名目錄建立celery.py import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 's13django_celery.settings') app = Celery('django_celery_demo') app.config_from_object('django.conf:settings', namespace='CELERY') # 自動去每一個已註冊的app中找 task.py 並執行. app.autodiscover_tasks() 2. 在配置文件中編寫broker和backend CELERY_BROKER_URL = 'redis://127.0.0.1:6379' CELERY_ACCEPT_CONTENT = ['json'] CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379' CELERY_TASK_SERIALIZER = 'json' 3. 編寫任務,在每一個已註冊app中找到task.py裏面編寫: from celery import shared_task @shared_task def add(x, y): return x + y 4. 在項目同名的目錄下編寫: from .celery import app as celery_app __all__ = ('celery_app',) 5. 啓動worker celery worker -A 項目目錄中和項目同名的文件夾名稱 -l info -P eventlet 6. 編寫django程序 - 建立任務 from django.shortcuts import render,HttpResponse from app01 import tasks def gen(request): # 當即執行任務 # result = tasks.add.delay(1,2) # print(result.id) # 一次性執行一個定時任務 ctime = datetime.datetime.now() utc_ctime = datetime.datetime.utcfromtimestamp(ctime.timestamp()) eta_utc_time = utc_ctime + datetime.timedelta(seconds=5) result = tasks.add.apply_async(args=[1, 3], eta=eta_utc_time) print(result.id) return HttpResponse('任務建立成功:%s' %result.id) - 檢查任務結果 from django.shortcuts import render,HttpResponse from celery.result import AsyncResult from s13django_celery import celery_app def check(request): task_id = request.GET.get('task') async = AsyncResult(id=task_id, app=celery_app) if async.successful(): data = async.get() print('成功', data) else: print('任務等待中被執行') return HttpResponse('...') """ # 12. 在django中週期性的執行定時任務 """ 方式一: s13django_celery/celery.py import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 's13django_celery.settings') app = Celery('s13django_celery') app.config_from_object('django.conf:settings', namespace='CELERY') # 自動去每一個已註冊的app中找 task.py 並執行. app.autodiscover_tasks() # app.conf.beat_schedule = { # 'add-every-5-seconds': { # 'task': 'app01.tasks.add', # 'schedule': 5.0, # 'args': (16, 16) # }, # } 啓動: celery worker -A s13django_celery -l info -P eventlet celery beat -A s13django_celery 方式二: pip3 install django_celery_beat 1. 註冊app INSTALLED_APPS = [ ... 'django_celery_beat' ] 2. 數據庫遷移 python manage.py migrate 3. 啓動worker celery worker -A s13django_celery -l info -P eventlet celery beat -A s13django_celery --scheduler django_celery_beat.schedulers:DatabaseScheduler 4. 在admin中建立任務 Crontabs Intervals Periodic tasks(任務表) Solar events """ # 13. 常見面試問題 """ 1. 用過celery嗎? - 用過,路飛. - 沒用過,研究過. 2. broker的選擇: - redis,簡單應用. - rabbitMQ,複雜應用(專業消息隊列). 3. app/broker/backend/worker 4. 作定時任務時,crontab和celery均可以?他們的區別是什麼? - crontab是linux的一個服務,使用時須要爲其編寫特定腳本. - celery是一個基於Python實現的框架,代碼和項目能夠編寫在一塊兒. 5. shared_task的所用是什麼? 6. django中使用celery是:使用定時任務能夠實如今數據庫指定任務(無需重啓). """