Spaces:
Running
Running
import asyncio | |
import nest_asyncio | |
from starfish.common.logger import get_logger | |
logger = get_logger(__name__) | |
def run_in_event_loop(coroutine): | |
"""Run a coroutine in the event loop, handling both nested and new loop cases. | |
Args: | |
coroutine: The coroutine to be executed | |
Returns: | |
The result of the coroutine execution | |
Note: | |
If an event loop is already running, nest_asyncio will be used to allow | |
nested execution. If no loop is running, a new event loop will be created. | |
""" | |
try: | |
# This call will raise an RuntimError if there is no event loop running. | |
asyncio.get_running_loop() | |
# If there is an event loop running (the call above doesn't raise an exception), we can use nest_asyncio to patch the event loop. | |
nest_asyncio.apply() | |
logger.debug(f"Running nested coroutine: {coroutine.__name__}") | |
except RuntimeError as e: | |
# If no event loop is running, asyncio | |
# Explicitly pass, since we want to fallback to asyncio.run | |
logger.debug(str(e)) | |
logger.debug(f"Running coroutine: {coroutine.__name__}") | |
return asyncio.run(coroutine) | |