首页 > 其他 > 详细

Django2.0 + Celery 3.125 实现定时任务

时间:2019-11-15 17:24:05      阅读:101      评论:0      收藏:0      [点我收藏+]

Django 2.0 + Celery 3.1.25 定时(周期)任务

1.目的

  最近根据项目需要,希望在django框架下实现一些定时任务功能

  此为demo示例, 简单的做每5s 实现 ‘hello world‘ 的打印

  踩过一些坑,最终还是顺利完成了配置。

2.基建

  使用的包:[django==2.0, django-celery==3.2.2, celery==3.1.25]

  创建Django项目 以及相关app

  在新建的app目录下 添加tasks文件夹

  在settings.py所在同级目录 新建 celery.py

C:.
│  celery
│  db.sqlite3
│  manage.py
│  requirements.txt
│
├─app_name
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  ├─migrations
│  │  │  __init__.py
│  │
│  ├─tasks
│  │  │  timer_job.py
│  │  │  __init__.py
│
├─project_name
│  │  celery.py
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py

 

 

  创建django-celery所需要的表, 在控制台执行

  python manage.py migrate djcelery

3.配置

  关于任务注册,我选择在celery.py里进行

  配置settings.py

  技术分享图片

  PS:  broker使用 rabbitmq 3.8.1   安装完成后,确定可以登录管理界面 15672即可

    backend 和 调度器 都与django orm关联

 

  配置celery.py  参考 :http://docs.celeryproject.org/en/3.1/django/first-steps-with-django.html

 1 from __future__ import absolute_import
 2 
 3 import os
 4 
 5 from celery import Celery
 6 
 7 from django.conf import settings
 8 
 9 from datetime import timedelta
10 
11 #from celery.schedules import crontab
12 
13 os.environ.setdefault(DJANGO_SETTINGS_MODULE, project_name.settings)
14 
15 app = Celery(project_name)
16 
17 app.config_from_object(django.conf:settings)
18 
19 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
20 
21 #此处使用 beat.schedule 无法完成注册
22 #任务注册也可在 settings里完成
23 app.conf.update(CELERYBEAT_SCHEDULE={
24     hello: {
25         task: app_name.tasks.timer_job.hello,
26         schedule: timedelta(second=10),
27         args: (),
28     },
29 })
30 
31 app.conf.timezone = UTC

  在project_name下的 __init__.py 导入celery实例

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

4.任务

 

  在app tasks文件夹下添加将要执行的任务 timer_job.py

from project_name import celery_appdef say_hello():
    return hello world

@celery_app.task
def hello():
    try:
        a = say_hello()
        print(a)
    except Exception:
        print(调用方法错误)

  在tasks文件夹下添加 __init__.py 

  (根据上面配置 worker查找注册任务本应该查找每个app下 tasks.py 但此处使用tasks文件夹 以应对添加多任务的情况,需要把tasks转为py包)

 

from .timer_job import hello

 

5.启动

  执行路径改为 celery.py的上级目录

  在控制台中 执行 python manage.py celery beat

celery beat v3.1.25 (Cipater) is starting.
__    -    ... __   -        _
Configuration ->
    . broker -> amqp://guest:**@localhost:5672//
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> djcelery.schedulers.DatabaseScheduler

    . logfile -> [stderr]@%INFO
    . maxinterval -> now (0s)
[2019-11-15 13:54:01,998: INFO/MainProcess] beat: Starting...
[2019-11-15 13:54:01,998: INFO/MainProcess] Writing entries (0)...
[2019-11-15 13:54:02,249: INFO/MainProcess] DatabaseScheduler: Schedule changed.
[2019-11-15 13:54:02,250: INFO/MainProcess] Writing entries (0)...
[2019-11-15 13:54:02,283: INFO/MainProcess] Scheduler: Sending due task hello (app_name.tasks.timer_job.hello)
[2019-11-15 13:54:02,309: INFO/MainProcess] Writing entries (1)...
[2019-11-15 13:54:12,284: INFO/MainProcess] Scheduler: Sending due task hello (app_name.tasks.timer_job.hello)
[2019-11-15 13:54:22,284: INFO/MainProcess] Scheduler: Sending due task hello (app_name.tasks.timer_job.hello)
[2019-11-15 13:54:32,285: INFO/MainProcess] Scheduler: Sending due task hello (app_name.tasks.timer_job.hello)
[2019-11-15 13:54:42,285: INFO/MainProcess] Scheduler: Sending due task hello (app_name.tasks.timer_job.hello)
[2019-11-15 13:54:52,286: INFO/MainProcess] Scheduler: Sending due task hello (app_name.tasks.timer_job.hello)

  可以看到提示消息每10s向队列发送任务信息

  执行路径改为 celery.py的上级目录

  在新控制台中执行 python manage.py celery -A project_name worker -l info

  warnings.warn(CDeprecationWarning(W_PICKLE_DEPRECATED))

 -------------- celery@PUZHA-PS6NN v3.1.25 (Cipater)
---- **** -----
--- * ***  * -- Windows-10-10.0.17134-SP0
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         project_name:0xf4f250
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ----
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery


[tasks]
  . app_name.tasks.timer_job.hello

[2019-11-15 13:55:10,912: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2019-11-15 13:55:10,974: INFO/MainProcess] mingle: searching for neighbors
[2019-11-15 13:55:12,080: INFO/MainProcess] mingle: all alone
[2019-11-15 13:55:12,280: INFO/MainProcess] Received task: app_name.tasks.timer_job.hello[05202beb-d26e-433e-9894-83e9eb9a5c4c]
[2019-11-15 13:55:12,281: INFO/MainProcess] Received task: app_name.tasks.timer_job.hello[3e3587fa-5352-4c55-bb89-1e7f4450da29]
[2019-11-15 13:55:12,282: INFO/MainProcess] Received task: app_name.tasks.timer_job.hello[6e8072c1-765d-445e-a880-4d81a49980c8]
[2019-11-15 13:55:12,283: INFO/MainProcess] Received task: app_name.tasks.timer_job.hello[02a8c7ac-2917-4919-9c8b-a51039ce01ed]
[2019-11-15 13:55:12,284: INFO/MainProcess] Received task: app_name.tasks.timer_job.hello[37e2d2e4-f7f6-4e40-a5b4-f03c5a439ff4]
[2019-11-15 13:55:12,285: INFO/MainProcess] Received task: app_name.tasks.timer_job.hello[fe6a126e-dcd5-4589-816b-04e2ee011050]
[2019-11-15 13:55:12,291: INFO/MainProcess] Received task: app_name.tasks.timer_job.hello[5d80097d-5f9c-4141-af1a-2c5da7fe61f9]
[2019-11-15 13:55:12,309: INFO/MainProcess] Received task: app_name.tasks.timer_job.hello[ffe49ee4-895a-4481-a0ac-edbf8b3c528b]
[2019-11-15 13:55:15,361: INFO/Worker-1] child process 14108 calling self.run()
[2019-11-15 13:55:15,407: INFO/Worker-1] child process 12952 calling self.run()
[2019-11-15 13:55:15,447: INFO/Worker-1] child process 22160 calling self.run()
[2019-11-15 13:55:15,560: INFO/Worker-1] child process 948 calling self.run()
[2019-11-15 13:55:16,123: INFO/Worker-1] child process 18836 calling self.run()
[2019-11-15 13:55:16,141: INFO/Worker-1] child process 18416 calling self.run()
[2019-11-15 13:55:16,476: INFO/Worker-1] child process 18776 calling self.run()
[2019-11-15 13:55:16,570: INFO/Worker-1] child process 21080 calling self.run()
[2019-11-15 13:55:19,363: WARNING/Worker-1] hello world
[2019-11-15 13:55:19,365: WARNING/Worker-1] hello world
[2019-11-15 13:55:19,364: INFO/MainProcess] Task app_name.tasks.timer_job.hello[05202beb-d26e-433e-9894-83e9eb9a5c4c] succeeded in 0s: None
[2019-11-15 13:55:19,368: WARNING/Worker-1] hello world
[2019-11-15 13:55:19,379: WARNING/Worker-1] hello world
[2019-11-15 13:55:19,380: INFO/MainProcess] Task app_name.tasks.timer_job.hello[3e3587fa-5352-4c55-bb89-1e7f4450da29] succeeded in 0.014999999999417923s: None
[2019-11-15 13:55:19,380: WARNING/Worker-1] hello world
[2019-11-15 13:55:19,381: WARNING/Worker-1] hello world
[2019-11-15 13:55:19,381: INFO/MainProcess] Task app_name.tasks.timer_job.hello[6e8072c1-765d-445e-a880-4d81a49980c8] succeeded in 0.014999999999417923s: None
[2019-11-15 13:55:19,382: WARNING/Worker-1] hello world
[2019-11-15 13:55:19,382: WARNING/Worker-1] hello world

 

 

 

  

 

 

 

Django2.0 + Celery 3.125 实现定时任务

原文:https://www.cnblogs.com/poolerzhao/p/11867644.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!