Асинхронный код Python из синхронного приложения

Что такое асинхронный код и зачем он вам может понадобиться я рассказывал в статье Несинхронный Python.

Иногда, например при экспериментах в REPL или отладке у нас возникает необходимость запускать асинхронный код из синхронных приложений Python.

Раньше это было довольно громоздко

import asyncio


async def main():
    print('Hello World!')


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()
Hello World!

С выходом Python 3.7 появился упрощенный способ запуска без явного создания цикла - функция asyncio.run

import asyncio


async def main():
    print('Hello World!')


if __name__ == '__main__':
    asyncio.run(main()) 
Hello World!

А Python 3.8 позволяет нам сразу запустить REPL в асинхронном режиме (python -m asyncio).

Если приведенный выше код в файле sync_async.py то в Python 3.8 можно:

python -m asyncio
>>> import sync_async
>>> await sync_async.main()
Hello World!