一、簡介
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