为了回答您的问题,我将为同一问题提供3种不同的解决方案。
情况1: 普通的python
import timedef sleep(): print(f'Time: {time.time() - start:.2f}') time.sleep(1)def sum(name, numbers): total = 0 for number in numbers: print(f'Task {name}: Computing {total}+{number}') sleep() total += number print(f'Task {name}: Sum = {total}n')start = time.time()tasks = [ sum("A", [1, 2]), sum("B", [1, 2, 3]),]end = time.time()print(f'Time: {end-start:.2f} sec')输出:
Task A: Computing 0+1Time: 0.00Task A: Computing 1+2Time: 1.00Task A: Sum = 3Task B: Computing 0+1Time: 2.01Task B: Computing 1+2Time: 3.01Task B: Computing 3+3Time: 4.01Task B: Sum = 6Time: 5.02 sec
情况2: 异步/等待做错了
import asyncioimport timeasync def sleep(): print(f'Time: {time.time() - start:.2f}') time.sleep(1)async def sum(name, numbers): total = 0 for number in numbers: print(f'Task {name}: Computing {total}+{number}') await sleep() total += number print(f'Task {name}: Sum = {total}n')start = time.time()loop = asyncio.get_event_loop()tasks = [ loop.create_task(sum("A", [1, 2])), loop.create_task(sum("B", [1, 2, 3])),]loop.run_until_complete(asyncio.wait(tasks))loop.close()end = time.time()print(f'Time: {end-start:.2f} sec')输出:
Task A: Computing 0+1Time: 0.00Task A: Computing 1+2Time: 1.00Task A: Sum = 3Task B: Computing 0+1Time: 2.01Task B: Computing 1+2Time: 3.01Task B: Computing 3+3Time: 4.01Task B: Sum = 6Time: 5.01 sec
情况3: 异步/等待正确完成 (与情况2相同,除了
sleep功能不同)
import asyncioimport timeasync def sleep(): print(f'Time: {time.time() - start:.2f}') await asyncio.sleep(1)async def sum(name, numbers): total = 0 for number in numbers: print(f'Task {name}: Computing {total}+{number}') await sleep() total += number print(f'Task {name}: Sum = {total}n')start = time.time()loop = asyncio.get_event_loop()tasks = [ loop.create_task(sum("A", [1, 2])), loop.create_task(sum("B", [1, 2, 3])),]loop.run_until_complete(asyncio.wait(tasks))loop.close()end = time.time()print(f'Time: {end-start:.2f} sec')输出:
Task A: Computing 0+1Time: 0.00Task B: Computing 0+1Time: 0.00Task A: Computing 1+2Time: 1.00Task B: Computing 1+2Time: 1.00Task A: Sum = 3Task B: Computing 3+3Time: 2.00Task B: Sum = 6Time: 3.01 sec
case 1与
case 2给相同
5 seconds,而
case 3公正
3 seconds。因此,
async/await doneright速度更快。
差异的原因在于
sleep功能的实现内。
# case 1def sleep(): print(f'Time: {time.time() - start:.2f}') time.sleep(1)# case 2async def sleep(): print(f'Time: {time.time() - start:.2f}') time.sleep(1)# case 3async def sleep(): print(f'Time: {time.time() - start:.2f}') await asyncio.sleep(1)sleep在
case 1和
case 2中是“相同”的。他们“睡觉”而不允许其他人使用资源。而
case 3允许在睡眠状态下访问资源。
在
case 2我们添加
async到正常功能。但是,事件循环将在 不中断的情况下
运行它。为什么?因为我们没有说允许循环在哪里中断您的函数以运行另一个任务。
在
case 3我们告诉事件循环中,确切地中断了该函数的位置以运行另一个任务。到底在哪里?
# case 3async def sleep(): print(f'Time: {time.time() - start:.2f}') await asyncio.sleep(1) # <-- Right here!更多关于此阅读这里
更新02 / May / 2020
考虑阅读
- 异步编程旅行者指南
- Asyncio期货和协程



