Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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
Python 是什么阻止我的异步代码运行异步?_Python_Python 3.x_Asynchronous - Fatal编程技术网

Python 是什么阻止我的异步代码运行异步?

Python 是什么阻止我的异步代码运行异步?,python,python-3.x,asynchronous,Python,Python 3.x,Asynchronous,我试图离开线程,开始使用异步。我试着写一些简单的东西,这样我就能更自如地使用异步;出于某种原因,我的异步代码不是异步的 我在线程中重写了相同的代码,与异步代码不同,它可以快速并行地工作 正常代码 导入时间 随机输入 def显示(x:int)->无: 时间.睡眠(random.randint(1,8)) 打印(x) def main(): 对于范围(10)内的i: 显示(一) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main() 输出 0 1 2

我试图离开线程,开始使用异步。我试着写一些简单的东西,这样我就能更自如地使用异步;出于某种原因,我的异步代码不是异步的

我在线程中重写了相同的代码,与异步代码不同,它可以快速并行地工作

正常代码

导入时间
随机输入
def显示(x:int)->无:
时间.睡眠(random.randint(1,8))
打印(x)
def main():
对于范围(10)内的i:
显示(一)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
输出

0
1
2
3
4
5
6
7
8
9
异步代码

导入时间
随机输入
导入异步
异步def显示(x:int)->无:
等待asyncio.sleep(random.randint(1,8))
打印(x)
异步def main():
对于范围(10)内的i:
等待显示(一)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
event\u loop=asyncio.get\u event\u loop()
事件\循环。运行\直到\完成(main())
事件_loop.close()
输出

0
1
2
3
4
5
6
7
8
9
5
9
3
0
4
2
1
8
6
7
线程代码

导入时间
随机输入
导入线程
def显示(x:int)->无:
时间.睡眠(random.randint(1,8))
打印(x)
def main():
线程=[]
对于范围(10)内的i:
线程(目标=显示,参数=[i])
threads.append(t)
t、 开始()
对于螺纹中的t:
t、 加入
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
输出

0
1
2
3
4
5
6
7
8
9
5
9
3
0
4
2
1
8
6
7
await display(i)
使用参数
i
运行
display
,该参数返回一个可等待的。然后立即使用
wait
等待,在那里阻止呼叫

如果您希望将它们全部安排在一起,然后在最后等待,则需要收集列表中的可等待项,然后立即等待所有可等待项

import time
import random
import asyncio

async def display(x: int) -> None:
    await asyncio.sleep(random.randint(1, 8)/10)
    print(x)

async def main():
    awaitables = []
    for i in range(10):
        awaitables.append(display(i))
    await asyncio.wait(awaitables)

if __name__ == '__main__':
    event_loop = asyncio.get_event_loop()
    event_loop.run_until_complete(main())
    event_loop.close()

是的,因为否则肯定会有人指出,你也可以在列表中写下:

async def main():
    await asyncio.wait([display(i) for i in range(10)])

进一步说明:

我相信你知道,尽管如此,我认为无论如何提及这一点很重要。代码是异步运行的,但不是并行运行的。使用
async
threading运行多个计算量大的函数。Thread
仍然只在一个cpu内核上运行它们,没有任何加速。Python解释器是单线程的