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 相关文章推荐
在Django框架中伪造捕捉到的URLconf值的方法
Jul 18 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
Python 12306抢火车票脚本
Feb 07 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
python读出当前时间精度到秒的代码
Jul 05 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 Python
关于python爬虫应用urllib库作用分析
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
phpmyadmin操作流程
2006/10/09 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
python中__call__方法示例分析
2014/10/11 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
Linux文件系统类型
2012/09/16 面试题
创伤外科专业推荐信范文
2013/11/19 职场文书
结构工程个人自荐信范文
2013/11/30 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
初一生物教学反思
2014/01/18 职场文书
告诉你怎样写创业计划书
2014/01/27 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
师范毕业生求职信
2014/07/11 职场文书
高中家长意见怎么写
2015/06/03 职场文书
会计主管竞聘书
2015/09/15 职场文书