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 遍历子文件和所有子文件夹的代码实例
Dec 21 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
python @classmethod 的使用场合详解
Aug 23 Python
Pytorch 中retain_graph的用法详解
Jan 07 Python
python通过matplotlib生成复合饼图
Feb 06 Python
Python socket处理client连接过程解析
Mar 18 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 Python
基于python实现操作git过程代码解析
Jul 27 Python
python 绘制正态曲线的示例
Sep 24 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读取IMAP邮件
2006/10/09 PHP
php explode函数实例代码
2012/02/27 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
PHP读取PPT文件的方法
2015/12/10 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
JavaScript XML操作 封装类
2009/07/01 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
js禁止表单重复提交
2017/08/29 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
pandas计数 value_counts()的使用
2019/06/24 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
python二元表达式用法
2019/12/04 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
python实现连连看游戏
2020/02/14 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
薇姿法国官网:Vichy法国
2021/01/28 全球购物
电力安全事故反思
2014/04/27 职场文书
教师见习报告范文
2014/11/03 职场文书
入党自荐书范文
2015/03/05 职场文书
党组织结对共建协议书
2016/03/23 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers