Python call async from sync

Python call async from sync

В Python существует известная проблема - вам нужно выбирать между моделями кода sync и async.

И если вы используете async код, вы можете вызвать sync код, но из этого кода вы НЕ МОЖЕТЕ снова вызвать async код.

Почему возникает эта проблема? Event loop, используемый кодом async, уже застрял в ожидании результата от кода sync. И если вы хотите вызвать async код сейчас, вы не можете повторно использовать тот же event loop.

Это похоже на архитектурный фейл.

Но мы нашли обходной путь для этого: https://github.com/erdewit/nest_asyncio

Работает отлично!

import asyncio
import nest_asyncio

nest_asyncio.apply()

# Assume this is a very complex async function that you don't want to make sync
async def your_complex_async_function():
    return 'result from async function'

def sync_wrapper_which_calls_async_func():
    loop = asyncio.get_event_loop()
    coroutine = your_complex_async_function()
    result = loop.run_until_complete(coroutine)
    return result

# Assume this is a library function which make callbacks and you want it to callback your async function
def library_sync_function(sync_callback):
    result = sync_callback()
    result += ', called from sync function'
    return result

async def async_main_function():
    result = library_sync_function(sync_wrapper_which_calls_async_func)
    result += ', called from async program'
    print(result)
    return

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(async_main_function())
    loop.close()

Смотрите также: