Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3.7,异步/等待打印顺序错误_Python_Python 3.x_Async Await_Python Asyncio - Fatal编程技术网

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

我在测试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())
    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.D
asyncio
主要用于与服务器的连接。我建议使用多线程,但是,也可以使用asyncio-您必须等待事件。如果我不需要等待它们的结果,我需要使用多线程吗?@D先生,请您投票并接受我的答案,好吗?@D先生,是的,在我看来,这是最好的库。这可能是因为您使用的是time.sleep而不是asyncio。sleep@user1558604asyncio.sleep在本代码中的行为方式与此相同。如果您尚未尝试,则必须等待asyncio.sleep()。