Python3.7,异步/等待打印顺序错误
我在测试Python3.7的异步/等待函数,并编写了如下简单代码:Python3.7,异步/等待打印顺序错误,python,python-3.x,async-await,python-asyncio,Python,Python 3.x,Async Await,Python Asyncio,我在测试Python3.7的异步/等待函数,并编写了如下简单代码: import asyncio import time async def first(): print('FIRST') async def second(): time.sleep(2) print('SECOND') async def main(): asyncio.create_task(second()) asyncio.create_task(second())
import asyncio
import time
async def first():
print('FIRST')
async def second():
time.sleep(2)
print('SECOND')
async def main():
asyncio.create_task(second())
asyncio.create_task(second())
asyncio.create_task(second())
asyncio.create_task(first())
asyncio.create_task(first())
asyncio.create_task(first())
asyncio.run(main())
当我运行此代码时,它会打印以下内容:
SECOND
SECOND
SECOND
FIRST
FIRST
FIRST
这不是我所期望的。我认为应该先打印FIRST
s,因为它们没有延迟。但是,create_task
会等到second()
完成后再继续执行文本异步任务
是否可以在不让异步任务互相等待的情况下执行异步任务?您必须使用
gather()
函数并稍微修改代码。您还必须使用wait
关键字
import asyncio
import time
async def first():
print('FIRST')
await asyncio.sleep(1)
print('SECOND')
async def main():
await asyncio.gather(first(), first(), first())
asyncio.run(main())
您不能使用
time.sleep()
函数,因为它不是异步的,会导致整个程序的实际睡眠。使用asyncio.sleep()
函数并等待它异步运行:
导入异步IO
异步def first():
打印('第一个')
异步def second():
#修复方法:
等待异步睡眠(2)
打印('秒')
异步def main():
等待asyncio.gather(
第二个(),
第二个(),
第二个(),
第一个(),
第一个(),
第一()
)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
asyncio.run(main())
结果应该是:
FIRST
FIRST
FIRST
SECOND
SECOND
SECOND
如果我的方法非常复杂,很难组合成一个,而
第二个
需要更多的时间来完成,并且第一个
不依赖于它?我是否需要在单独的线程上而不是异步地运行它们?@Mr.Dasyncio
主要用于与服务器的连接。我建议使用多线程,但是,也可以使用asyncio-您必须等待事件。如果我不需要等待它们的结果,我需要使用多线程吗?@D先生,请您投票并接受我的答案,好吗?@D先生,是的,在我看来,这是最好的库。这可能是因为您使用的是time.sleep而不是asyncio。sleep@user1558604asyncio.sleep在本代码中的行为方式与此相同。如果您尚未尝试,则必须等待asyncio.sleep()。