celery的基礎用法可以參考之前轉載的文章:
https://blog.csdn.net/ATOOHOO/article/details/88976521
1、編寫異步任務隊列文件:
celery 按照固定的套路是可以編寫出一下的程序的,中間人使用的是Redis,其他的RabbitMQ等也是可以,可以參考官方文檔:
http://docs.celeryproject.org/en/latest/getting-started/brokers/index.html#broker-overview
from django.core.mail import send_mail
from django.conf import settings
from celery import Celery
import time
# django環境的初始化,在任務處理者worker一端加以下幾句
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
django.setup()
# 創建一個Celery類的實例對象,celery_tasks.tasks可以隨便取一個名字,但是一般取有意義的名字
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/8')
# 定義任務函數
@app.task
def send_register_active_email(to_email, username, token):
"""發送激活郵件"""
# 組織郵件信息
subject = '天天生鮮歡迎信息'
message = ''
sender = settings.EMAIL_PROM # 發送人
receiver = [to_email]
html_message = '<h1>%s, 歡迎您成爲天天生鮮註冊會員</h1>請點擊下面鏈接激活您的賬戶<br/><a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>' % (username, token, token)
send_mail(subject, message, sender, receiver, html_message=html_message)
# time.sleep(5)
celery中的一個很重要的角色是worker,集合Django實用的話,會用到Django中的一些配置,所以需要引入配置信息:
# django環境的初始化,在任務處理者worker一端加以下幾句
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
django.setup()
否則的話會報出下面的錯誤信息,說是沒能找到Django的配置信息:
[2019-08-20 18:10:45,039: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[92d688f5-a42e-441a-8676-08eb2f480c8b]
[2019-08-20 18:10:45,148: ERROR/ForkPoolWorker-2] Task celery_tasks.tasks.send_register_active_email[92d688f5-a42e-441a-8676-08eb2f480c8b] raised unexpected: ImproperlyConfigured('Requested setting EMAIL_PROM, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.',)
Traceback (most recent call last):
File "/home/toohoo/.local/lib/python3.6/site-packages/celery/app/trace.py", line 385, in trace_task
R = retval = fun(*args, **kwargs)
File "/home/toohoo/.local/lib/python3.6/site-packages/celery/app/trace.py", line 648, in __protected_call__
return self.run(*args, **kwargs)
File "/home/toohoo/PycharmProjects/mydailyfresh/celery_tasks/tasks.py", line 22, in send_register_active_email
sender = settings.EMAIL_PROM # 發送人
File "/usr/local/lib/python3.6/dist-packages/django/conf/__init__.py", line 56, in __getattr__
self._setup(name)
File "/usr/local/lib/python3.6/dist-packages/django/conf/__init__.py", line 39, in _setup
% (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_PROM, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
在主要的view裏面調用隊列發送郵件:
# 獲取username
username = ...
# 獲取email
email = ...
# 定義好token
token = ...
# 開始調用異步隊列發送郵件celery:異步執行任務
send_register_active_email.delay(email, username, token)
注意: 不要漏掉使用delay()函數,否則如果使用send_register_active_email(email, username, token)
的話依然是使用Django內置的郵件模塊幫我們發的郵件!
啓動成功和發送成功之後的信息:
(venv) toohoo@ubuntu:~/PycharmProjects/mydailyfresh$ celery -A celery_tasks.tasks worker -l info
-------------- celery@ubuntu v4.3.0 (rhubarb)
---- **** -----
--- * *** * -- Linux-4.15.0-58-generic-x86_64-with-Ubuntu-18.04-bionic 2019-08-20 18:42:53
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: celery_tasks.tasks:0x7febbecf5198
- ** ---------- .> transport: redis://127.0.0.1:6379/8
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. celery_tasks.tasks.send_register_active_email
[2019-08-20 18:42:53,989: INFO/MainProcess] Connected to redis://127.0.0.1:6379/8
[2019-08-20 18:42:54,002: INFO/MainProcess] mingle: searching for neighbors
[2019-08-20 18:42:55,028: INFO/MainProcess] mingle: all alone
[2019-08-20 18:42:55,046: WARNING/MainProcess] /home/toohoo/PycharmProjects/mydailyfresh/venv/lib/python3.6/site-packages/celery/fixups/django.py:202: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
warnings.warn('Using settings.DEBUG leads to a memory leak, never '
[2019-08-20 18:42:55,046: INFO/MainProcess] celery@ubuntu ready.
[2019-08-20 18:44:00,183: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[c3c4d266-838e-4955-ac39-f0ca38cf0463]
[2019-08-20 18:44:06,714: INFO/ForkPoolWorker-2] Task celery_tasks.tasks.send_register_active_email[c3c4d266-838e-4955-ac39-f0ca38cf0463] succeeded in 6.527261982992059s: None
項目代碼和地址爲:
https://github.com/too-hoo/mydailyfresh