Python async function

3дрaвствyйте, начал читать про асинхронность, но возник вопрос.

В первом случаем мне нужно запустить 2 цикла в разных потоках, во втором нужно получить return асинхронной функции.

import asyncio

async def test():
    while True:
        print(0)
        await asyncio.sleep(1)

async def main():
    asyncio.ensure_future(test())
    while True:
        print(1)
        await asyncio.sleep(1)

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

Код выше запустит 2 цикла в разных потоках, но через asyncio.ensure_future() нельзя получить return, то есть следующий код не сработает.

import asyncio

async def test():
    return 1

async def main():
    print( asyncio.ensure_future(test()))
    

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

Поэтому я ищу функцию которая сможет запустить функцию в отдельном потоке, как asyncio.ensure_future() но что бы можно было получить return от функции


Ответы (1 шт):

Автор решения: CrazyElf

Чтобы получить результат работы асинхронной функции, используйте await:

async def main():
    print(await asyncio.ensure_future(test()))
          ^^^^^

Вывод:

1

Вы получаете из асинхронной функции задачу Task, чтобы дождаться результата её работы и получить результат нужен await.

Вы так и делаете в первом примере кода, просто вас там не интересует результат работы функций, а только их завершение. Но await используется в обоих случаях - и когда нужно просто вызвать асинхронную функцию, и когда от неё нужно получить результат.

P.S. Попробовал в Google Colab, а вроде даже и так работает:

print(await test())
→ Ссылка