У меня есть следующий код Python:
Код: Выделить всё
import asyncio, time
async def fn1(x):
await asyncio.sleep(3)
print(f"fn1 is called with x={x}")
return "fn1 SUCCESS"
async def fn2(y):
await asyncio.sleep(2)
print(f"fn2 is called with y={y}")
raise asyncio.TimeoutError()
print(y, '*'*10)
return "fn2 SUCCESS"
async def main():
print("start:",time.ctime())
result = ['No results']
try:
result = await asyncio.gather(
fn1("fn1"),
fn2("fn2"),
return_exceptions=False,
# return_exceptions=True,
)
except Exception as e:
print('e:', type(e), str(e))
print("end:",time.ctime())
print(result)
asyncio.run(main())
Код: Выделить всё
start: Mon Sep 30 17:25:28 2024
fn2 is called with y=fn2
e:
end: Mon Sep 30 17:25:30 2024
['No results']
If return_Exceptions имеет значение False (по умолчанию), первое возникшее исключение
немедленно распространяется на задачу, ожидающую метода сбора(). Другие ожидаемые объекты в последовательности aws не будут отменены и продолжат выполняться.
Но это противоречит результату Я получил. Почему сопрограмма fn1("fn1") не завершает работу? Если она завершает работу, строка print(f"fn1 вызывается с x={x}") должен его распечатать.
Затем я внес простое изменение в fn1, где время «сна» короче:
Код: Выделить всё
async def fn1(x):
await asyncio.sleep(3-1)
print(f"fn1 is called with x={x}")
return "fn1 SUCCESS"
Код: Выделить всё
start: Mon Sep 30 17:30:29 2024
fn1 is called with x=fn1
fn2 is called with y=fn2
e:
end: Mon Sep 30 17:30:31 2024
['No results']
Подробнее здесь: https://stackoverflow.com/questions/790 ... tions-fals