diff --git a/bilibili_api/utils/sync.py b/bilibili_api/utils/sync.py index 03622213..2a9c27d5 100644 --- a/bilibili_api/utils/sync.py +++ b/bilibili_api/utils/sync.py @@ -5,29 +5,23 @@ """ import asyncio -from typing import Any, TypeVar, Coroutine +from concurrent.futures import ThreadPoolExecutor +from typing import Any, Coroutine -T = TypeVar("T") - - -def __ensure_event_loop() -> None: - try: - asyncio.get_event_loop() - - except: - asyncio.set_event_loop(asyncio.new_event_loop()) - - -def sync(coroutine: Coroutine[Any, Any, T]) -> T: +def sync(coroutine: Coroutine) -> Any: """ 同步执行异步函数,使用可参考 [同步执行异步代码](https://nemo2011.github.io/bilibili-api/#/sync-executor) Args: - coroutine (Coroutine): 异步函数 + coroutine (Coroutine): 执行异步函数所创建的协程对象 Returns: - 该异步函数的返回值 + 该协程对象的返回值 """ - __ensure_event_loop() - loop = asyncio.get_event_loop() - return loop.run_until_complete(coroutine) + try: + asyncio.get_running_loop() + except RuntimeError: + return asyncio.run(coroutine) + else: + with ThreadPoolExecutor() as executor: + return executor.submit(asyncio.run, coroutine).result()