对Tornado异步操作Sqlalchemy方法的选定 不错
使用原因
在一个实时通讯的项目中,由于需要使用Websocket这一协议,便在Python框架中选定了Tornado,也同时使用了Sqlalchemy这一ORM框架。
大家都知道Tornado有异步非阻塞特性,但Sqlalchemy是同步操作,这会大大影响性能,会影响的用户体验。
为了能解决这一问题,我便在网上搜寻资料,发现有使用Celery的,有使用run_on_executor装饰器的,甚至自己封装异步Sqlalchemy的等等方法。
由于缺少实践,我觉定对Celery、run_on_executor进行尝试
Celery
以下是官方文档的介绍:
Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。
它是一个专注于实时处理的任务队列,同时也支持任务调度。
Celery 有广泛、多样的用户与贡献者社区,你可以通过 IRC 或是 邮件列表 加入我们。
Celery 是开源的,使用 BSD 许可证 授权。
官网地址:http://docs.jinkan.org/docs/celery/
安装环境
服务器:Ubuntu 12.04.5 LTS (GNU/Linux 3.2.0-67-generic x86_64)
- 安装RabbitMQ
安装RabbitMQ Server
sudo apt-get install rabbitmq-server
RabbitMQ提供了一些简单实用的命令用于管理服务器运行状态:
查看服务器运行状态: enable rabbitmq_management
启动服务器:rabbitmq-server start
停止服务器:rabbitmq-server stop
查看服务器中所有的消息队列信息 :rabbitmqctl list_queues
查看服务器种所有的路由信息: rabbitmqctl list_exchanges
查看服务器种所有的路由与消息队列绑定信息 :rabbitmq list_bindings
* 启用WEB管理台
/usr/lib/rabbitmq/bin
sudo ./rabbitmq-plugins enable rabbitmq_management
- 添加远程管理账户
将下面配置写入/etc/rabbitmq/rabbitmq.conf.d/rabbitmq.config文件中
[
{rabbit, [{tcp_listeners, [5672]}, {loopback_users, ["ken"]}]}
].
cd /usr/lib/rabbitmq/bin/
sudo rabbitmqctl add_user ken 123456
sudo rabbitmqctl set_user_tags ken administrator
sudo rabbitmqctl set_permissions -p / ken ".*" ".*" ".*"
安装Celery
Celery详情查看官方文档- 使用pip安装
pip install Celery
Celery方法示例
- 新建一个task.py
from celery import Celery
celery = Celery('tasks', broker='amqp://')
celery.conf.CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'amqp')
@celery.task(name='task.db_operation')
def db_operation(id):
# 耗时的数据库操作
pass
- 使用worker参数执行我们的程序的task
celery -A tasks worker --loglevel=info
- 新建一个handler.py
import tcelery
tcelery.setup_nonblocking_producer()
from tasks import db_operation
calss Resource(RequestHandler):
@asynchronous
def get():
# 参数通过args传递,回调通过callback指定
db_operation.apply_async(args=[id], callback=self.on_success)
def on_success(self, response):
# 获取返回的结果
resource = response.result
self.write(resource)
self.finish()
此时,Resource的Get请求已经变成异步非阻塞了。
run_on_executor方法示例
- 新建一个handler.py
from concurrent.futures import ThreadPoolExecutor
from tornado.concurrent import run_on_executor
class ChatHandler(web.RequestHandler):
executor = ThreadPoolExecutor(4)
@web.asynchronous
@gen.coroutine
def get(self):
resource = yield self.get_db_operation()
self.write(resource)
self.finish()
@web.asynchronous
@gen.coroutine
def post(self):
yield self.post_db_operation()
self.write('success')
self.finish()
@run_on_executor
def get_db_operation(self):
return resource
@run_on_executor
def post_db_operation(self):
pass
总结
这一整套走下来,个人觉得使用Celery部署麻烦,而且一旦大量使用Celery,极有可能导致队列长度过长,影响处理效率。最后我选择使用了run_on_executor方法。
作者:KenHan
链接:https://www.jianshu.com/p/9eb901ad735b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
对Tornado异步操作Sqlalchemy方法的选定 不错的更多相关文章
- 将Flask应用程序部署在nginx,tornado的简单方法
来自:http://www.xuebuyuan.com/618750.html 在网上搜索了一下部署flask应用的方法,大部分是用wsgi部署在nginx上面,部署了很久,都没有成功,可能是我领悟能 ...
- Tornado—options.define()方法与options.options解读
tornado为我们提供了一个便捷的工具,tornado.options模块——全局参数定义.存储.转换. tornado是facebook开源的非阻塞web容器,类似java的netty,torna ...
- 【Python】部署上手App后端服务器 - Linux环境搭建安装Python、Tornado、SQLAlchemy
基于阿里云服务器端环境搭建 文章目录 基于阿里云服务器端环境搭建 配置开发环境 安装 Python 3.8.2 安装 Tornado 安装 MySQL 安装 mysqlclient 安装 SQLAlc ...
- 【转】Android下编译jni库的二种方法(含示例) -- 不错
原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...
- jQuery on() 方法 为选定已存在元素和未来元素绑定标准事件和自定义事件
很有必要说说jQuery的on方法,这个方法存在大乾坤大奥秘,主要注意两点: 1.为已存在元素和未来元素(动态添加元素)绑定处理函数. 2.自定义一个非标准的事件并绑定处理函数. 定义和用法 on() ...
- tornado 非阻塞方法
http://sebastiandahlgren.se/2014/06/27/running-a-method-as-a-background-thread-in-python/
- 定义 iOS 方法名等不错的规范
1.配置视图不应命名为 setxxxx, 而应叫做 showxxxx 2.让按钮高亮不应叫做 showxxx, 而应叫做 highlightedxxx. 3,弹出 toastView 可以用 show ...
- 回退(pop&present)到根页面(根控制器)的方法,很不错~
http://blog.csdn.net/assholeu/article/details/45897035
- 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务
http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...
随机推荐
- ios 中实现storyboard 与xib 之间的切换
1,跳转到xib 假设有一个按钮,这个按钮就是实现跳转的,那么在这个按钮的点击事件中,代码可以这样写. AViewController *a1= [[AViewController alloc]ini ...
- vue脚手架解决跨域问题-------配置反向代理
1.打开config/index.js 2.在dev配置对象中找到proxyTable:{} 3.添加如下配置 // 配置反向代理,解决跨域请求 proxyTable: { '/api': { tar ...
- CentOS 7安装Xfce和VNC
很多VPS商提供的CentOS 7镜像只有最小化安装,这样就只能在命令行下操作,如果要调试代码的话,还是图形化界面方便,而且CentOS自带的Gnome和KDE都比较占内存.启动桌面后就占用了400M ...
- centos 安装 mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz 详细步骤
1.卸载Linux系统上自带的mysql插件(old版本) 查找mysql相关安装: rpm -qa|grep -i mysql 可能会出现以下的一个或多个,没有更好,说明你的系统很干净,但是以防万一 ...
- Intellij IDEA生成serialVersionUID
默认情况下Intellij IDEA不会提示继承了Serializable接口的类生成serialVersionUID的警告.如果需要生成serialVersionUID,就要在Preferences ...
- Registering Components-->Autofac registration(include constructor injection)
https://autofaccn.readthedocs.io/en/latest/register/registration.html Registration Concepts (有4种方式来 ...
- 【bzoj4806~bzoj4808】炮车马后——象棋四连击
bzoj4806——炮 题目传送门:bzoj4806 这种题一看就是dp...我们可以设$ f[i][j][k] $表示处理到第$ i $行,有$ j $列没放炮,$ k $列只放了一个炮.接着分情况 ...
- mac 安装python3
Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. 现在 Mac 上默认安装的 python 版本为 2.7 版本,若 安装 新版本需要 通过 该地址进行下载: http ...
- 两种以太网 RDMA 协议: iWARP 和 RoCE
本文是讲演 How Ethernet RDMA Protocols iWARP and RoCE Support NVMe over Fabrics[1]的摘要. 如果 NVMe 存储系统与主机是分离 ...
- Maven到底是个啥玩意
Maven,是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 上面是百度百科对Maven的正式介绍,如果你是Maven初学者,我估计你看完之后心中肯 ...