tornado 异步 mysql_关于Tornado-MySQL异步

场景

团队定下用比较简洁的Tornado作为后端框架,既然使用万恶的Python作为后端的话,跟数据库的I/O爱恨情仇总是绕不过的一关。当然最简单的选择就是MySQLdb啦,C语言写好的底层总是那么靠谱,但是总归是同步的阻塞操作,有没有什么办法能够实现异步呢?

同步阻塞和异步非阻塞这两个概念提到的非常多,在我个人看法里,同步异步主要是由调用方视角来看,需要等待结果的操作是同步,执行完毕通知结果的操作是异步;而阻塞和非阻塞更多是程序的视角,线程挂起等到执行结果的是阻塞,不挂起线程的则是非阻塞。

解决方案

Python自带异步库

首先考虑的是Python本身带的异步I/O库,比如gevent或是比较新的asyncio,基石还是Py2.7,所以先尝试了gevent。打上猴子补丁之后,所有标准库中的thread/socket都被替换掉了,自然都变成非阻塞的了。但是有一个问题,他只能支持Python的原生库,比如Pymysql或者是Oracle写的mysql-connector,这里选择pymysql先做尝试。

gevent通过greenlet提供了比较完善的协程,基本思想是每当遇到I/O操作的时候,就自动切换到其他的greenlet,以保证程序不会因为I/O操作卡住等待。

import pymysql

from gevent import socket,monkey

monkey.patch_socket()

import time

def asyn_query(sql):

try:

conn = pymysql.connect(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值