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中的__SLOTS__属性使用示例
Feb 18 Python
Python实现简单过滤文本段的方法
May 24 Python
Python实现Linux中的du命令
Jun 12 Python
对Python中type打开文件的方式介绍
Apr 28 Python
Python中@property的理解和使用示例
Jun 11 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
python pytest进阶之conftest.py详解
Jun 27 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
python标记语句块使用方法总结
Aug 05 Python
基于Python快速处理PDF表格数据
Jun 03 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 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 MemCached高级缓存配置图文教程
2010/08/05 PHP
PHP 实现缩略图
2021/03/09 PHP
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
js 方法实现返回多个数据的代码
2009/04/30 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
js实现每日签到功能
2018/11/29 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
VUE脚手架具体使用方法
2019/05/20 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
英国网上自行车商店:Tredz Bikes
2019/10/29 全球购物
物资采购方案
2014/06/12 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
小学生暑假生活总结
2015/07/13 职场文书
2016新年晚会开场白
2015/12/03 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
浅谈Vue的computed计算属性
2022/03/21 Vue.js