python协程执行顺序的问题

发布于 2022-09-07 11:36:06 字数 1883 浏览 25 评论 0

问题描述:

我在做廖雪峰实战篇时,操作数据库时有一个疑问,我先定义了两个协程,然后定义一个主协程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不应该是一定显示在第一列吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

薄荷→糖丶微凉 2022-09-14 11:36:06

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文