一、简介
Celery 通过消息机制进行通信,通常使用中间人(Broker)作为客户端和职程(Worker)调节。
启动一个任务,客户端向消息队列发送一条消息,然后中间人(Broker)将消息传递给一个职程(Worker),最后由职程(Worker)进行执行中间人(Broker)分配的任务。
二、中间人(Broker)
1。windows中使用
本次使用rabbitmq作为broker,不设后端backend
rabbitmq在4.0之后不支持windows使用,可以下载老版本的在本地windows使用。
http://erlang.org/download/otp_win64_17.3.exe 先下载安装erlang语言
https://www.rabbitmq.com/download.html 再下载rabbitmq 我在本地下载的3.5.8版本
部分RabbitMQ版本可能与erlang语言版本不适配而导致不能使用
安装好后默认的http访问端口为15672
amqp端口为5672
默认用户名密码
guest guest
2.在docker中启动
docker run -d --hostname localhost --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq:3.6.15-management
启动带有web页面的rabbitmq
-d 后台进程运行
hostname RabbitMQ主机名称
name 容器名称
-p port:port 本地端口:容器端口
-p 15672:15672 http访问端口
-p 5672:5672 amqp访问端口
http只能用宿主ip+端口进行访问
ampq 可以用localhost和宿主ip都访问
默认用户名密码
guest guest
三、启动celery
add_task.py
from tasks import add result = add.apply_async(args=[10,20],countdown=0) print result.id
task.py
from celery import Celery import time cel= Celery('tasks',broker='amqp://guest@127.0.0.1:5672//') @cel.task def add(x, y): time.sleep(1) return x + y
然后使用
celery -A task worker --loglevel=info 在终端中启动
可以在rbbitmq的web界面看到通道和队列信息
四、与odoo集成使用
先配置celery
celery_config.py
CELERY_IMPORTS = ('odoo_celery.pxy',)
pxy.py
#! /usr/bin/env python2 # encoding=utf-8 import sys import time
reload(sys) sys.setdefaultencoding('utf8') import os from os import path q=path.dirname(__file__) ScriptPath = os.path.split( os.path.realpath( __file__ ) )[0] parent_path = os.path.dirname(ScriptPath) sys.path.append(parent_path) from celery import Celery import odoo_celery cel= Celery('grade',broker='amqp://guest@127.0.0.1:5672//') cel.config_from_object('odoo_celery.celery_config') @cel.task def add(x,b,c): time.sleep(1) print x+b+c
在odoo中
models.py
# -*- coding: utf-8 -*- from odoo import models, fields, api import random import os import sys from os import path d = path.dirname(__file__) parent_path = os.path.dirname(os.path.dirname(d)) sys.path.append(parent_path) from odoo_celery import pxy class Course(models.Model): # 课程 _name = 'grade.course' name = fields.Char(string=u'课程名',required=True,index=True) description=fields.Text(u"描述") responsible_teacher_id = fields.Many2one('grade.teacher', string=u"授课老师",ondelete='set null',domain="[('sex','=','woman'),('age','>',10)]") student_num = fields.Integer(string=u"班级人数") period_ids = fields.One2many('grade.period','course_id',string=u"课时") student_ids = fields.Many2many('grade.student',string=u"报名学生") @api.model def create(self, vals): record = super(Course, self).create(vals) result = pxy.add.delay(1,2,3) print result.id print self.name # print '----------------------------------------------' # result = add.delay(4, 4) # print result # print '----------------------------------------------' return record
启动odoo
启动celery
celery -A pxy worker --loglevel=info