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的Urllib库的一些高级用法
Apr 30 Python
用python找出那些被“标记”的照片
Apr 20 Python
Python协程的用法和例子详解
Sep 09 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
Jun 11 Python
pandas dataframe添加表格框线输出的方法
Feb 08 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
Python爬虫学习之翻译小程序
Jul 30 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 Python
详解Django ORM引发的数据库N+1性能问题
Oct 12 Python
python UIAutomator2使用超详细教程
Feb 19 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 图片上传实现代码 带详细注释
2010/04/29 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
python for 循环获取index索引的方法
2019/02/01 Python
Python编写打字训练小程序
2019/09/26 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
Python Map 函数的使用
2020/08/28 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
简单租房协议书
2014/04/09 职场文书
投资合作协议书范本
2014/04/17 职场文书
销售团队口号大全
2014/06/06 职场文书
党员民主评议自我评价
2014/10/20 职场文书
论语读书笔记
2015/06/26 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang