目錄celery使用
django配置celery
celery是乙個強大的 分布式任務佇列 的 非同步處理框架,它可以讓任務的執行完全脫離主程式,甚至可以被分配到其他主機上執行。我們通常使用它來實現非同步任務(async task)和定時任務(crontab)
celery 官網:
celery 官方文件英文版:
celery 官方文件中文版:
任務模組, 包含非同步任務和定時任務,非同步任務通常在業務邏輯中被觸發併發往broker任務佇列, 定時任務由celery beat 程序周期性地發往broker任務佇列
訊息中介軟體, 就是任務排程佇列,用來接收任務, 將任務儲存到佇列中, 就像是生產者與消費者模型中的佇列一樣
celery本身不提供broker, 官方推薦使用rabbitmq和redis
任務的執行單元,它實時監控broker佇列, 獲取佇列中的任務, 並執行, 可以看做是生產者與消費者模型中的消費者
任務執行結果的儲存單元,用來儲存任務結果, 以便查詢
celery本身不提供backend, 官方推薦使用rabbitmq和redis
python安裝celery:pip install celery
我們使用redis作為broker和backend, 因此確保你的裝置配置了redis環境
"""
project
├── celery_task # celery包
│ ├── __init__.py # 包檔案
│ ├── celery.py # celery連線和配置相關檔案,且名字必須是celery.py
│ └── tasks.py # 所有任務函式
├── add_task.py # 新增任務
└── get_result.py # 獲取結果
"""
"""
1.執行add_task.py將任務新增到佇列
2.cmd切換至所在檔案目錄celery_task下執行worker:
>: celery worker -a celery_task -l info -p eventlet
3.執行get_result.py獲取任務結果
"""
# celery.py
from celery import celery
# 配置訊息中介軟體, 用來接收任務
broker = 'redis:'
# 配置backend, 用來儲存任務執行結果
backend = 'redis:'
# worker, 任務執行單元
# tasks.py
# 定義任務
def add(x, y):
res = x + y
print(f'+=')
return res
def minus(x, y):
res = x - y
print(f'-=')
return res
# add_task.py
from .tasks import add, minus
# 在業務邏輯中觸發非同步任務
add_results = add.delay(10, 20)
# 任務執行結果的id
print(add_results.id)
# get_result.py
from .add_tasks import add_results
from celery.result import asyncresult
if __name__ == '__main__':
if async.successful():
result = async.get()
print('任務執行成功')
print(result)
elif async.failed():
print('任務失敗')
elif async.status == 'pending':
print('任務等待中被執行')
elif async.status == 'retry':
print('任務異常後正在重試')
elif async.status == 'started':
print('任務已經開始被執行')
from celery_task.tasks import add
from datetime import timedelta, datetime
# 新增延時任務, 10秒後執行
# 任務執行結果的id
print(add_results.id)
注意: 週期任務是通過celery beat
來週期性新增的, , 因此啟動worker服務之後, 還要重開乙個cmd視窗啟動beat服務:celery beat -a celery_task -l info
# celery.py
from celery import celery
from datetime import timedelta
from celery.schedules import crontab
# 配置訊息中介軟體, 用來接收任務
broker = 'redis:'
# 配置backend, 用來儲存任務執行結果
backend = 'redis:'
# worker, 任務執行單元
# 時區
'add-task': ,
'minus-task':
}
在根目錄下建立包資料夾celery_task
"""
project
├── celery_task # celery包
├── __init__.py # 包檔案
├── celery.py # celery連線和配置相關檔案,且名字必須是celery.py
└── tasks.py # 所有任務函式
"""
# 1.載入django配置環境
import os
os.environ.setdefault("django_settings_module", 'luffyapi.settings.dev')
# 2.載入celery配置環境
from celery import celery
broker = 'redis:'
backend = 'redis:'
# 時區
# utc
from datetime import timedelta
'update-banner-cache':
}
from home.models import banner
from home.serializers import bannermoderserializer
from django.conf import settings
from django.core.cache import cache
def update_banner_cache():
print('lalal')
banner_query = banner.objects.filter(is_delete=false, is_show=true).order_by('-order').all()
serializer_obj = bannermoderserializer(data=banner_query, many=true)
banner_data = serializer_obj.data
for banner in banner_data:
banner['image'] = settings.base_url + banner.get('image')
cache.set('banner_cache', banner_data)
return true
celery系列 一 celery 相關配置
celery result backend amqp 官網優化的地方也推薦使用c的librabbitmq celery task result expires 1200 celery任務執行結果的超時時間,我的任務都不需要返回結果,只需要正確執行就行 celeryd concurrency 50 c...
celery 執行celery定時任務
場景 在虛擬機器上執行 python django celery redis 的定時任務 可能遇到的問題 如果在執行過程中,定時任務突然退出,並報以下錯誤,錯誤顯示,沒有許可權訪問一些目錄檔案 解決方案 1 關閉當前redis服務 在step 3中有描述如何關閉 2 以root使用者執行啟動redi...
語言翻譯成組合語言 收下這十點C語言入門須知
一提到語言這個詞,人們自然想到的是像英語 漢語等這樣的自然語言,因為它是人和人相互交流資訊不可缺少的工具。大家聽到我們之間交流的就是漢語,英語。比如一些單詞是英語,主要還是用漢語在交流。而今天,計算機遍布了我們生活的每乙個角落,除了人和人之間的相互交流之外,我們必須和計算機交流。用什麼樣的方式和計算...