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 相关文章推荐
django1.8使用表单上传文件的实现方法
Nov 04 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
详解python里的命名规范
Jul 16 Python
Python实现Selenium自动化Page模式
Jul 14 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
linux环境下Django的安装配置详解
Jul 22 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
Django之PopUp的具体实现方法
Aug 31 Python
python绘制随机网络图形示例
Nov 21 Python
Django实现图片上传功能步骤解析
Apr 22 Python
python palywright库基本使用
Jan 21 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
javascript动画浅析
2012/08/30 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
2018/12/11 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
计划生育标语
2014/06/23 职场文书
庐山导游词
2015/02/03 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript