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())

输出:

clipboard.png
(注意:其实顺序不是一定的,有时1会在第一列)

我的疑惑:

await不就是yield from吗?也就是把控制权交给主循环,那么我在同一个循环里有多个await不应该是顺序执行吗?所以按道理来说,1不应该是一定显示在第一列吗?

阅读 4.7k
1 个回答

在命令行中测试了30余次不会出现乱序的问题,确定是pycharm本身的问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题