Почему await не блокирует выполнение t2 до завершения t1? - PullRequest
0 голосов
/ 06 апреля 2020

Чем ключевое слово python await отличается от Node js await?

В node js ключевые слова await блокируют выполнение следующей строки до тех пор, пока текущая строка не будет полностью разрешена или ожидается. Но в python продолжает выполнение t2 ( из приведенного ниже примера ) до завершения t1.

import asyncio
import time
async def heavy():
    print("start computing")
    await asyncio.sleep(3)
    print("end computing")
async def compute(x, y):
    print("Compute %s + %s ..." % (x, y))
    await asyncio.sleep(6)
    return x + y
async def print_sum(x, y):
    result = await compute(x, y)
    print("%s + %s = %s" % (x, y, result))
async def main():
    print(f"Starting at {time.strftime('%X')}")
    t1= asyncio.create_task(print_sum(10,20))
    t2= asyncio.create_task(heavy())
    await t1
    await t2 
    print(f"Ending at {time.strftime('%X')}") 
asyncio.run(main())

Даже если t2 вызывается после t1, t2 завершается до t1.

Мои вопросы:

  1. Что такое точное использование ключевого слова await в python? Я искал много ресурсов, пока не выяснил об этом.
  2. Что понимает система, когда она сталкивается с ключевым словом await?
  3. Как main() метод в приведенном выше коде работает? Не стесняйтесь давать построчное объяснение

Пожалуйста, предоставьте подробное объяснение по вышеуказанным Вопросам. , .

1 Ответ

0 голосов
/ 06 апреля 2020

await просто позволяет вам записывать асинхронные вызовы в линию с другим вашим синхронным кодом -

import asyncio

async def add(a,b):
  await asyncio.sleep(1)   # sample async function
  return a + b

async def main():
  t1 = await add(1, 2)       # pauses, returns 3 after 1 second
  print(t1)                  # 3
  t2 = await add(3, 4)       # pauses, returns 7 after 1 second
  print(t2)                  # 7
  print(await add(t1, t2))   # pauses, prints 10 after 1 second

print("please wait...")
asyncio.run(main())

# "please wait..."
# 3
# 7
# 10
...