Tornado + Celery + RabbitMQ
声明:代码是从项目中截取的, 为进行测试
使用Celery任务队列,Celery 只是一个任务队列,需要一个broker媒介,将耗时的任务传递给Celery任务队列执行,执行完毕将结果通过broker媒介返回。官方推荐使用RabbitMQ作为消息传递,redis也可以
一、Celery 介绍:
二、配置
单个参数配置:
app.conf.CELERY_RESULT_BACKEND = ‘redis://localhost:6379/0‘
多个参数配置:
app.conf.update(
CELERY_BROKER_URL = ‘amqp://guest@localhost//‘,
CELERY_RESULT_BACKEND = ‘redis://localhost:6379/0‘
)
从配置文件中获取:(将配置参数写在文件app.py中)
BROKER_URL=‘amqp://guest@localhost//‘
CELERY_RESULT_BACKEND=‘redis://localhost:6379/0‘
app.config_from_object(‘celeryconfig‘)
三、案例
启动一个Celery 任务队列,也就是消费者:
from celery import Celery
celery = Celery(‘tasks‘, broker=‘amqp://guest:guest@119.29.151.45:5672‘, backend=‘amqp‘) 使用RabbitMQ作为载体, 回调也是使用rabbit作为载体 @celery.task(name=‘doing‘) #异步任务,需要命一个独一无二的名字
def doing(s, b):
print(‘开始任务‘)
logging.warning(‘开始任务--{}‘.format(s))
time.sleep(s)
return s+b
启动任务生产者
#!/usr/bin/env python
# -*- coding:utf-8 -*- import tcelery
from tornado.web import RequestHandler
import tornado tcelery.setup_nonblocking_producer() # 设置为非阻塞生产者,否则无法获取回调信息 class MyMainHandler(RequestHandler):
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self, *args, **kwargs):
print('begin')
result = yield tornado.gen.Task(sleep.apply_async, args=[10]) # 使用yield 获取异步返回值,会一直等待但是不阻塞其他请求
print('ok - -{}'.format(result.result)) # 返回值结果 # sleep.apply_async((10, ), callback=self.on_success)
# print(‘ok -- {}‘.format(result.get(timeout=100)))#使用回调的方式获取返回值,发送任务之后,请求结束,所以不能放在处理tornado的请求任务当中,因为请求已经结束了,与客户端已经断开连接,无法再在获取返回值的回调中继续向客户端返回数据 # result = sleep.delay(10) #delay方法只是对apply_async方法的封装而已
# data = result.get(timeout=100) #使用get方法获取返回值,会导致阻塞,相当于同步执行 def on_success(self, response): # 回调函数
print('Ok - - {}'.format(response))
=======================
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.web import Application
from tornado.ioloop import IOLoop
import tcelery
from com.analysis.handlers.data_analysis_handlers import *
from com.analysis.handlers.data_summary_handlers import *
from com.analysis.handlers.data_cid_sumjson_handler import Cid_Sumjson_Handler
from com.analysis.handlers.generator_handlers import GeneratorCsv, GeneratorSpss
Handlers = [
(r"/single_factor_variance_analysis/(.*)", SingleFactorVarianceAnalysis), # 单因素方差检验
]
if __name__ == "__main__":
tcelery.setup_nonblocking_producer()
application = Application(Handlers)
application.listen(port=8888, address="0.0.0.0")
IOLoop.instance().start()
server
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.gen
import tornado.web
from com.analysis.core.base import BaseAnalysisRequest
from com.analysis.tasks.data_analysis import *
class SingleFactorVarianceAnalysis(BaseAnalysisRequest):
@tornado.gen.coroutine
def get(self, *args, **kwargs):
response = yield self.celery_task(single_factor_variance_analysis.apply_async, params=args)
print(response.result)
self.write(response.result[2])
handler
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from collections import defaultdict
import pandas as pd
import numpy as np
import pygal
import tornado.gen
from pygal.style import LightStyle
from tornado.web import RequestHandler
import json
from com.analysis.db.db_engine import DBEngine
from com.analysis.utils.log import LogCF
from com.analysis.handlers.data_cid_sumjson_handler import cid_sumjson
class BaseRequest(RequestHandler):
def __init__(self, application, request, **kwargs):
super(BaseRequest, self).__init__(application, request, **kwargs)
class BaseAnalysisRequest(BaseRequest):
def __init__(self, application, request, **kwargs):
super(BaseAnalysisRequest, self).__init__(application, request, **kwargs)
@tornado.gen.coroutine
def celery_task(self, func, params, queue="default_analysis"):
args_list = list(params)
args_list.insert(0, "")
response = yield tornado.gen.Task(func, args=args_list, queue=queue)
raise tornado.gen.Return(response)
basehandler
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from celery import Celery
from com.analysis.core.chi_square_test import CST
from com.analysis.generator.generator import GeneratorCsv, GeneratorSpss
celery = Celery(
'com.analysis.tasks.data_analysis',
broker='amqp://192.168.1.1:5672',
include='com.analysis.tasks.data_analysis'
)
celery.conf.CELERY_RESULT_BACKEND = "amqp://192.168.1.1:5672"
celery.conf.CELERY_ACCEPT_CONTENT = ['application/json']
celery.conf.CELERY_TASK_SERIALIZER = 'json'
celery.conf.CELERY_RESULT_SERIALIZER = 'json'
celery.conf.BROKER_HEARTBEAT = 30
celery.conf.CELERY_IGNORE_RESULT = False # this is less important
logger = Logger().getLogger()
@celery.task()
def single_factor_variance_analysis(*args):
return SFV().do_(*args)
task
Tornado + Celery + RabbitMQ的更多相关文章
- celery+RabbitMQ 实战记录2—工程化使用
上篇文章中,已经介绍了celery和RabbitMQ的安装以及基本用法. 本文将从工程的角度介绍如何使用celery. 1.配置和启动RabbitMQ 请参考celery+RabbitMQ实战记录. ...
- Airflow 配置celery+rabbitmq和celery+redis
Airflow 配置celery+rabbitmq 1.安装celery和rabbitmq组件 pip3 install apache-airflow[celery] pip3 install apa ...
- airflow 安装配置celery+rabbitmq celery+redis
AirFlow的安装可以参考:https://www.cnblogs.com/braveym/p/11378851.html 这里介绍的是AirFlow 安装配置celery+rabbitmq 和 ...
- django+celery +rabbitmq
celery是一个python的分布式任务队列框架,支持 分布的 机器/进程/线程的任务调度.采用典型的生产者-消费者模型 包含三部分:1. 队列 broker :可使用redis ,rabbitmq ...
- 消息队列&Celery&RabbitMQ&zeromq
一.消息队列 什么是消息队列? “消息队列”是在消息的传输过程中保存消息的容器. “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象. 消息 ...
- 从celery rabbitmq with docker-compose 引出对容器、依赖注入、TDD的感悟
用docker配置项目管理系统taiga的时候,不是我一个人遇到这个问题.https://github.com/douglasmiranda/docker-taiga/issues/5 问题描述: 用 ...
- 如何使用django+celery+RabbitMQ实现异步执行
1)安装需要安装RabbitMQ.Celery和Django-celeryCelery和Django-celery的安装直接pip就好 2)修改settings.py在INSTALLED_APPS中加 ...
- django框架下celery+rabbitmq+flower完成异步任务
[转载请注明出处:] http://www.cnblogs.com/yukityan/p/8035787.html 环境: ubuntu16.04 64位 安装: sudo apt-get insta ...
- Django+celery+rabbitmq实现邮件发送
一.环境 1.pip包 amqp==2.4.2 anyjson==0.3.3 billiard==3.6.0.0 celery==4.3.0 Django==2.2 dnspython==1.16.0 ...
随机推荐
- ImageView 最大bitmap 4096
ImageView 最大bitmap 4096,超出不显示图片
- VS2015 调试中断点突然失效的解决办法、VS调试时关闭调试让浏览器继续保留页面
VS2010 调试中断点突然失效的解决办法 问题描述:在调试前加了断点,但debug时红色的断点变成透明的圆圈加一个感叹号,执行到该处时也不会停止. 这个问题遇到过几次了,前几次都没怎么注意,有时候是 ...
- Spring Boot 中使用 Swagger2 构建强大的 RESTful API 文档
项目现状:由于前后端分离,没有很好的前后端合作工具. 由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型.HTTP头部信息.HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下 ...
- HTML5学习笔记(二十):JavaScript中的标准对象
这里提到的标准对象指ECMAScript中定义的对象,无论JavaScript运行那种环境(浏览器.Node.js)下都存在的对象. typeof 在JavaScript的世界里,一切都是对象. 但是 ...
- 行为类模式(七):观察者(Observer)
定义 定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新. UML 优点 观察者和被观察者之间是松耦合的,分别可以各自独立改变. Subject在发送 ...
- (原创)C++11改进我们的程序之move和完美转发
本次要讲的是右值引用相关的几个函数:std::move, std::forward和成员的emplace_back,通过这些函数我们可以避免不必要的拷贝,提高程序性能.move是将对象的状态或者所有权 ...
- Asp.Net采集网页方法大全(5种)
/// <summary>方法一:比较推荐 /// 用HttpWebRequest取得网页源码 /// 对于带BOM的网页很有效,不管是什么编码都能正确识别 /// </summar ...
- IntelliJ IDEA中的properties文件乱码转成中文[unicode码转中文]
在IntelliJ IDEA中,一些.properties后缀的配置文件中的中文常常会是下面的样子,看不懂怎么办? 解决办法:File-->Settings-->File Encoding ...
- C#数组 添加元素
例1: string[] a = new string[] { "1", "2", "3" }; 给a追加一个 "4" ...
- LeetCode: Construct Binary Tree from Inorder and Postorder Traversal 解题报告
Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...