1 创建project:
node2:/scan#django-admin.py startproject picha
node2:/scan#ls
picha
创建应用:
node2:/scan/picha#django-admin.py startapp demo
node2:/scan/picha#ls
demo manage.py picha
node2:/scan/picha#tree
.
├── demo
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── picha
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
3 directories, 12 files
二 下面在settings文件中配置celery相关的配置:
# CELERY STUFF
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://localhost:6379'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定时任务
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'demo',
'djcelery',
)
然后修改市区:
TIME_ZONE = 'Asia/Shanghai'
时区不对,计划任务是不会按时间执行的!
另外,我们还需要在创建一个celery.py文件,他会自动发现我们app下面的task!
#! /usr/bin/env python
# coding: utf-8
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'picha.settings')
app = Celery('picha')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
现在我们在demo的app下面创建测试用的task!
from __future__ import absolute_import
from celery import shared_task,task
@shared_task()
def add(x,y):
# return x + y
print x + y
@shared_task()
def mul(x,y):
print "%d * %d = %d" %(x,y,x*y)
return x*y
@shared_task()
def sub(x,y):
print "%d - %d = %d"%(x,y,x-y)
return x - y
@task(ignore_result=True,max_retries=1,default_retry_delay=10)
def just_print():
print "Print from celery task"
@task()
def Task_A(message):
Task_A.update_state(state='PROGRESS', meta={'progress': 0})
sleep(10)
Task_A.update_state(state='PROGRESS', meta={'progress': 30})
sleep(10)
return message
python manage.py migrate
node2:/scan/picha#python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, djcelery, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying djcelery.0001_initial... OK
Applying sessions.0001_initial... OK
node2:/scan/picha#
启动celery:
node2:/celery/djtest#python manage.py celeryd -l info
测试:
node2:/celery/djtest#python manage.py shell
Python 2.7.3 (default, Mar 30 2017, 20:15:12)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from demo.tasks import *
>>> t=Task_A.delay("heel2")
[2017-12-05 20:28:51,801: INFO/MainProcess] Received task: portal.tasks.Task_A[d6d3d300-1b5f-481a-be42-d21c1af99fd6]
[2017-12-05 20:29:11,828: INFO/MainProcess] Task portal.tasks.Task_A[d6d3d300-1b5f-481a-be42-d21c1af99fd6] succeeded in 20.024760922s: u'heel2'
[2018-09-16 22:06:55,006: WARNING/MainProcess] celery@node2 ready.
[2018-09-16 22:10:13,534: ERROR/MainProcess] Received unregistered task of type u'demo.tasks.Task_A'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.
The full contents of the message body was:
{u'utc': True, u'chord': None, u'args': [u'heel2'], u'retries': 0, u'expires': None, u'task': u'demo.tasks.Task_A', u'callbacks': None, u'errbacks': None, u'timelimit': [None, None], u'taskset': None, u'kwargs': {}, u'eta': None, u'id': u'0d25a203-f4e4-4696-8638-39d4d9eb8c8f'} (261b)
Traceback (most recent call last):
File "/usr/local/python27/lib/python2.7/site-packages/celery/worker/consumer.py", line 465, in on_task_received
strategies[type_](message, body,
KeyError: u'demo.tasks.Task_A'
调整tasks.py 需要重启服务
node2:/scan/picha#^C
node2:/scan/picha#python manage.py celeryd -l info
/usr/local/python27/lib/python2.7/site-packages/celery/platforms.py:812: RuntimeWarning: You are running the worker with superuser privileges, which is
absolutely not recommended!
Please specify a different user using the -u option.
User information: uid=0 euid=0 gid=0 egid=0
uid=uid, euid=euid, gid=gid, egid=egid,
-------------- celery@node2 v3.1.26.post2 (Cipater)
---- **** -----
--- * *** * -- Linux-2.6.32-431.el6.x86_64-x86_64-with-centos-6.5-Final
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: default:0x2ddee10 (djcelery.loaders.DjangoLoader)
- ** ---------- .> transport: redis://localhost:6379//
- ** ---------- .> results: redis://localhost:6379/
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> celery exchange=celery(direct) key=celery
[tasks]
. demo.tasks.Task_A
. demo.tasks.add
. demo.tasks.just_print
. demo.tasks.mul
. demo.tasks.sub
[2018-09-16 22:13:24,162: INFO/MainProcess] Connected to redis://localhost:6379//
[2018-09-16 22:13:24,173: INFO/MainProcess] mingle: searching for neighbors
[2018-09-16 22:13:25,181: INFO/MainProcess] mingle: all alone
[2018-09-16 22:13:25,192: WARNING/MainProcess] /usr/local/python27/lib/python2.7/site-packages/djcelery/loaders.py:133: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
warn('Using settings.DEBUG leads to a memory leak, never '
[2018-09-16 22:13:25,192: WARNING/MainProcess] celery@node2 ready.