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))   # нашел такое решение работающее :) 
→ Ссылка