【Python】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())

输出:

【Python】python协程执行顺序的问题
(注意:其实顺序不是一定的,有时1会在第一列)

我的疑惑:

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

回答

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

以上是 【Python】python协程执行顺序的问题 的全部内容, 来源链接: utcz.com/a/79115.html

回到顶部