python как получить возвращаемое значение асинхронной функции
Как можно получить возвращаемое значение асинхронной фукнции
import asyncio
async def test(asd: bool):
if asd is True:
print("true")
return True
else:
print("not true")
return False
# наподобие обычной функции
res = test(asd=0)
print(f"{res=}, {type(res)=}")
Ответы (2 шт):
Автор решения: Сергей
→ Ссылка
Асинхронное получение результатов делается через модуль Future. Учитывая, что у вас кусок небольшой, вот пример, как я делал задачу по асинхронному чтению из файла и записи в файл (на базе другого примера из учебника Чернышова (но объяснений у него мало про этой теме)):
import asyncio
import functools
def callback(future):
future.result()
async def register_callbacks(all_done):
# 5. Регистрация идёт методом, который добавляет обратный вызов
# (передавая туда параметры),который запускается после выполнения
# объекта (иными словами: при завершении работы)
all_done.add_done_callback(functools.partial(callback))
async def main(all_done, file_name):
# 4. Функция main ждёт, пока не выполнится регистрация callback-функции
# для экземпляра (именно эта часть добавлена для асинхронного полученя
# результатов)- await позволяет сопрограмме отдать контроль назад в
# главный цикл,который содержит порядок исполнения всех сопрограмм:
await register_callbacks(all_done)
with open(file_name, 'r',encoding="utf-8") as f:
readed_info = f.read()
# 6. Отрабатывает обратный вызов (future.result() получает
# результирующее значение, так как до него вызывается метод set_result)
all_done.set_result(readed_info)#сюда результат read помещается
def async_write (file_name, value_holder):
with open(file_name, 'w',encoding="utf-8") as f:
f.write(value_holder)
if __name__ == "__main__":
# 1. Создается цикл
event_loop = asyncio.get_event_loop()
try:
# 2. Создаётся экземпляр класса Future (он нужен для получения
# результата из сопрограммы):
all_done = asyncio.Future()
# 3. Запускается созданный цикл и он блокирует основную часть,
# пока не отработает функция main:
event_loop.run_until_complete(main(all_done, "read_.txt"))
# После завершения всего с 3 по 6, запускается часть finally с записью в
# файл
finally:
string=all_done.result()
async_write ("write_.txt", string)
event_loop.close()
Вот вариант чуть попроще (без устаревшей функции):
import asyncio
import functools
def callback(future):
future.result()
async def register_callbacks(all_done):
all_done.add_done_callback(functools.partial(callback))
def async_write (file_name, value_holder):
with open(file_name, 'w',encoding="utf-8") as f:
f.write(value_holder)
async def main():
all_done = asyncio.Future()
await register_callbacks(all_done)
#print('Установка результирующего значения future - результат read')
with open("read_.txt", 'r',encoding="utf-8") as f:
readed_info = f.read()
all_done.set_result(readed_info)#сюда результат read помещается
async_write ("write_.txt", all_done.result())
if __name__ == "__main__":
asyncio.run(main())
Автор решения: almaz
→ Ссылка
import asyncio
async def test(asd: bool):
if asd is True:
print("true")
return True
else:
print("not true")
return False
my_response = asyncio.run(test(asd=0)) # нашел такое решение работающее :)