Another solution might be a custom function like this:
def call_async(coro):
try:
loop = asyncio.get_running_loop()
except RuntimeError:
return asyncio.run(coro)
else:
return loop.run_until_complete(coro)
This should take care of all necessary cleanup in case we’re not running in an event loop. Would that make sense?