python中aioysql(异步操作MySQL)的方法


Posted in Python onApril 11, 2019

python异步IO初探

探索异步IO执之前,先说说IO的种类

1.阻塞IO最简单,即读写数据时,需要等待操作完成,才能继续执行。进阶的做法就是用多线程来处理需要IO的部分,缺点是开销会有些大。

2.非阻塞IO,即读写数据时,如果暂时不可读写,则立刻返回,而不等待。因为不知道什么时候是可读写的,所以轮询时可能会浪费CPU时间。

3.IO复用,即在读写数据前,先检查哪些描述符是可读写的,再去读写。select 和 poll 就是这样做的,它们会遍历所有被监视的描述符,查看是否满足,这个检查的过程是阻塞的。而 epoll、kqueue 和/dev/poll 则做了些改进,事先注册需要检查哪些描述符的哪些事件,当状态发生变化时,内核会调用对应的回调函数,将这些描述符保存下来;下次获取可用的描述符时,直接返回这些发生变化的描述符即可。

4.信号驱动,即描述符就绪时,内核发送SIGIO信号,再由信号处理程序处理这些信号即可。不过信号处理的时机是从内核态返回用户态时,感觉也得把这些事件收集起来才好处理,有点想模拟IO复用了。

5.最后时异步IO,即读写数据时,只注册事件,内核完成读写后(读取的数据会复制到用户态),再调用事件处理函数。这整个过程都不会阻塞调用线程。

Python 3.4 开始,标准库里又新增了 asyncio 这个模块。

从原理上来说,它和 Tornado 其实差不多,都是注册 IO 事件,然后在 IO loop 中等待事件发生,然后调用相应的处理函数。

aiomysql说明

1. poll

此库提供一个简单的连接对象用法:

import asyncio
import aiomysql
loop = asyncio.get_event_loop()
@asyncio.coroutine
def go()
 pool = yield from aiomysql.create_pool(host='127.0.0.1', port=3306,
           user='root', password='',
           db='mysql', loop=loop)
 with (yield from pool) as conn:
  cur = yield from conn.cursor()
  yield from cur.execute("SELECT 10")
  # print(cur.description)
  (r,) = yield from cur.fetchone()
  assert r == 10
 pool.close()
 yield from pool.wait_closed()
loop.run_until_complete(go())

解释:

create_pool(minsize=1, maxsize=10, loop=None, **kwargs)

一个协程,创建连接池,连接database

参数:

minsize(int)最小的池子 , 反之maxsize(int)
loop一个可选的事件循环实例,若未循环,使用 asyncio.get_event_loop()
echo(bool)默认log执行SQL查询
kwargs
Class pool:最重要的是获得连接:

with (yield from pool) as conn:
 cur = yield from conn.cursor()

2.  aiomysql — API Reference

connection

该库用来连接MySQL,使用简单的aiomysql.connect(),可以连接一个数据库或者关联池子以连接更多

import asyncio # 举例说明
import aiomysql
loop = asyncio.get_event_loop()
@asyncio.coroutine
def test_example():
 conn = yield from aiomysql.connect(host='127.0.0.1', port=3306,
          user='root', password='', db='mysql',
          loop=loop)
 cur = yield from conn.cursor()
 yield from cur.execute("SELECT Host,User FROM user")
 print(cur.description)
 r = yield from cur.fetchall()
 print(r)
 yield from cur.close()
 conn.close()
loop.run_until_complete(test_example())

3. Cursors 游标

import asyncio
import aiomysql
loop = asyncio.get_event_loop()
@asyncio.coroutine
def test_example():
 conn = yield from aiomysql.connect(host='127.0.0.1', port=3306,
          user='root', password='',
          db='mysql', loop=loop)
 # create default cursor
 cursor = yield from conn.cursor()
 # execute sql query # 执行sql查询
 yield from cursor.execute("SELECT Host, User FROM user")
 # fetch all results
 r = yield from cursor.fetchall()
 # detach cursor from connection
 yield from cursor.close()
 # close connection
 conn.close()
loop.run_until_complete(test_example())

总结

以上所述是小编给大家介绍的aioysql(异步操作MySQL)-python,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
python去掉字符串中重复字符的方法
Feb 27 Python
Python生成随机密码的方法
Jun 16 Python
python分布式环境下的限流器的示例
Oct 26 Python
Python爬虫使用脚本登录Github并查看信息
Jul 16 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
Feb 21 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
详解python播放音频的三种方法
Sep 23 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
python实现程序重启和系统重启方式
Apr 16 Python
零基础小白多久能学会python
Jun 22 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
很酷的python表白工具 你喜欢我吗
Apr 11 #Python
2019 Python最新面试题及答案16道题
Apr 11 #Python
【python】matplotlib动态显示详解
Apr 11 #Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 #Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
Apr 11 #Python
python面试题小结附答案实例代码
Apr 11 #Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 #Python
You might like
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
js几个验证函数代码
2010/03/25 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
Django model序列化为json的方法示例
2018/10/16 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
python将txt文件读取为字典的示例
2018/12/22 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
阿巴庭院:Abba Patio
2019/06/18 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
面向对象编程的优势是什么
2015/12/17 面试题
js实现弹框效果
2021/03/24 Javascript
计算机专业优秀大学生自我总结
2014/01/21 职场文书
法定代表人资格证明书
2015/06/18 职场文书
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
详解TypeScript的基础类型
2022/02/18 Javascript