python中aioysql(异步操作MySQL)的方法
python异步IO初探
探索异步IO执之前,先说说IO的种类
1.阻塞IO最简单,即读写数据时,需要等待操作完成,才能继续执行。进阶的做法就是用多线程来处理需要IO的部分,缺点是开销会有些大。
2.非阻塞IO,即读写数据时,如果暂时不可读写,则立刻返回,而不等待。因为不知道什么时候是可读写的,所以轮询时可能会浪费CPU时间。
3.IO复用,即在读写数据前,先检查哪些描述符是可读写的,再去读写。select和poll就是这样做的,它们会遍历所有被监视的描述符,查看是否满足,这个检查的过程是阻塞的。而epoll、kqueue和/dev/poll则做了些改进,事先注册需要检查哪些描述符的哪些事件,当状态发生变化时,内核会调用对应的回调函数,将这些描述符保存下来;下次获取可用的描述符时,直接返回这些发生变化的描述符即可。
4.信号驱动,即描述符就绪时,内核发送SIGIO信号,再由信号处理程序处理这些信号即可。不过信号处理的时机是从内核态返回用户态时,感觉也得把这些事件收集起来才好处理,有点想模拟IO复用了。
5.最后时异步IO,即读写数据时,只注册事件,内核完成读写后(读取的数据会复制到用户态),再调用事件处理函数。这整个过程都不会阻塞调用线程。
Python3.4开始,标准库里又新增了asyncio这个模块。
从原理上来说,它和Tornado其实差不多,都是注册IO事件,然后在IOloop中等待事件发生,然后调用相应的处理函数。
aiomysql说明
1.poll
此库提供一个简单的连接对象用法:
importasyncio importaiomysql loop=asyncio.get_event_loop() @asyncio.coroutine defgo() pool=yieldfromaiomysql.create_pool(host='127.0.0.1',port=3306, user='root',password='', db='mysql',loop=loop) with(yieldfrompool)asconn: cur=yieldfromconn.cursor() yieldfromcur.execute("SELECT10") #print(cur.description) (r,)=yieldfromcur.fetchone() assertr==10 pool.close() yieldfrompool.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
Classpool:最重要的是获得连接:
with(yieldfrompool)asconn: cur=yieldfromconn.cursor()
2. aiomysql—APIReference
connection
该库用来连接MySQL,使用简单的aiomysql.connect(),可以连接一个数据库或者关联池子以连接更多
importasyncio#举例说明 importaiomysql loop=asyncio.get_event_loop() @asyncio.coroutine deftest_example(): conn=yieldfromaiomysql.connect(host='127.0.0.1',port=3306, user='root',password='',db='mysql', loop=loop) cur=yieldfromconn.cursor() yieldfromcur.execute("SELECTHost,UserFROMuser") print(cur.description) r=yieldfromcur.fetchall() print(r) yieldfromcur.close() conn.close() loop.run_until_complete(test_example())
3.Cursors游标
importasyncio importaiomysql loop=asyncio.get_event_loop() @asyncio.coroutine deftest_example(): conn=yieldfromaiomysql.connect(host='127.0.0.1',port=3306, user='root',password='', db='mysql',loop=loop) #createdefaultcursor cursor=yieldfromconn.cursor() #executesqlquery#执行sql查询 yieldfromcursor.execute("SELECTHost,UserFROMuser") #fetchallresults r=yieldfromcursor.fetchall() #detachcursorfromconnection yieldfromcursor.close() #closeconnection conn.close() loop.run_until_complete(test_example())
总结
以上所述是小编给大家介绍的aioysql(异步操作MySQL)-python,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!