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 相关文章推荐
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
利用python模拟实现POST请求提交图片的方法
Jul 25 Python
python SMTP实现发送带附件电子邮件
May 22 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 Python
python抓取需要扫微信登陆页面
Apr 29 Python
python爬虫之自制英汉字典
Jun 24 Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Python代码实现http/https代理服务器的脚本
Aug 12 Python
Python imread、newaxis用法详解
Nov 04 Python
python numpy数组复制使用实例解析
Jan 10 Python
python 爬取英雄联盟皮肤并下载的示例
Dec 04 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
php 数组使用详解 推荐
2011/06/02 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
php下Memcached入门实例解析
2015/01/05 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
Laravel 5.3 学习笔记之 错误&日志
2016/08/28 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
Bootstrap实现模态框效果
2019/09/30 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
python实现百度关键词排名查询
2014/03/30 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
婚礼证婚人证婚词
2014/01/08 职场文书
设计师个人求职信范文
2014/02/02 职场文书
岗位职责说明书
2014/05/07 职场文书
室内趣味活动方案
2014/08/24 职场文书
八一建军节演讲稿
2014/09/10 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL