celery

# -*- 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是:使用定時任務能夠實如今數據庫指定任務(無需重啓).
"""
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息