python协程执行顺序的问题
问题描述:
我在做廖雪峰实战篇时,操作数据库时有一个疑问,我先定义了两个协程,然后定义一个主协程await顺序执行这两个协程(我认为是顺序执行...),并打印了日志,结果发现并不是我预想的结果。
python版本:3.6.4
完整代码如下:
import logging
logging.basicConfig(level=logging.INFO)#设置最低打印等级为INFO
import aiomysql
import asyncio
#定义简单的打印日志函数
def log(sql):
logging.info('SQL:'+sql)
#创建连接池,绑定到__pool全局变量中
async def creatpool(loop,**kwargs):
global __pool
__pool=await aiomysql.create_pool(
host=kwargs.get('host','localhost'),
port=kwargs.get('port',3306),
password=kwargs.get('password'),
db=kwargs.get('db'),
user=kwargs.get('user','root'),
charset=kwargs.get('charset','utf8'),
autocommit=kwargs.get('autocommit',True),
minsize=kwargs.get('minsize',1),
maxsize=kwargs.get('maxsize',10),
loop=loop
)
return 1
# select 其实就是传入sql语句的参数,返回一个list,含有每一列的dict
async def select(sql, args, size=None):
log(sql)
with (await __pool) as conn:
cur=await conn.cursor(aiomysql.DictCursor)
c=await cur.execute(sql,args)
if size:
r=await cur.fetchmany(size)
else:
r=await cur.fetchall()
log(str(c)+'rows affected')
await cur.close()
return r
# 下面是调试的代码
loop=asyncio.get_event_loop()
async def main():
a=await creatpool(loop=loop,db='populate',password='1QQZHukexinQQ')
print(a)
c=await select('select * from customers',())
print('main:',c)
loop.run_until_complete(main())
输出:
(注意:其实顺序不是一定的,有时1会在第一列)
我的疑惑:
await
不就是yield from
吗?也就是把控制权交给主循环,那么我在同一个循环里有多个await
不应该是顺序执行吗?所以按道理来说,1不应该是一定显示在第一列吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在命令行中测试了30余次不会出现乱序的问题,确定是pycharm本身的问题。