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利用elaphe制作二维条形码实现代码
May 25 Python
python查看FTP是否能连接成功的方法
Jul 30 Python
Python查询IP地址归属完整代码
Jun 21 Python
tensorflow实现softma识别MNIST
Mar 12 Python
numpy中loadtxt 的用法详解
Aug 03 Python
python使用matplotlib绘制热图
Nov 07 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
Python3 log10()函数简单用法
Feb 19 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
python基于SMTP协议发送邮件
May 31 Python
Python Django实现layui风格+django分页功能的例子
Aug 29 Python
mac使用python识别图形验证码功能
Jan 10 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python队列的定义与使用方法示例
2017/06/24 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
致100米运动员广播稿
2014/02/14 职场文书
大学班级学风建设方案
2014/05/01 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
英文版辞职信
2015/02/28 职场文书
新学期家长寄语2016
2015/12/03 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
opencv 分类白天与夜景视频的方法
2021/06/05 Python