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解释器是单线程的