diff --git a/CHANGELOGS/v9.md b/CHANGELOGS/v9.md index 5be6682..b9f28d2 100644 --- a/CHANGELOGS/v9.md +++ b/CHANGELOGS/v9.md @@ -1,3 +1,7 @@ +v9.0.2 2021/11/06 ++ 修复部分文档错误 ++ 增加对多线程的支持 + v9.0.1 2021/11/02 + 修复 video_uploader 上传大文件时转码失败的错误 diff --git a/bilibili_api/utils/network.py b/bilibili_api/utils/network.py index 7d5c46f..b3f61be 100644 --- a/bilibili_api/utils/network.py +++ b/bilibili_api/utils/network.py @@ -16,20 +16,18 @@ from .Credential import Credential from .. import settings +__session_pool = {} @atexit.register def __clean(): """ 程序退出清理操作。 """ - async def __clean_task(): - await __session.close() + loop = asyncio.get_event_loop() - if __session is None or __session.closed: - return + async def __clean_task(): + await __session_pool[loop].close() - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) if loop.is_closed(): loop.run_until_complete(__clean_task()) else: @@ -161,9 +159,6 @@ async def request(method: str, return real_data -__session: aiohttp.ClientSession = None - - def get_session(): """ 获取当前模块的 aiohttp.ClientSession 对象,用于自定义请求 @@ -171,10 +166,13 @@ def get_session(): Returns: aiohttp.ClientSession """ - global __session - if __session is None: - __session = aiohttp.ClientSession(loop=asyncio.get_event_loop()) - return __session + loop = asyncio.get_event_loop() + session = __session_pool.get(loop, None) + if session is None: + session = aiohttp.ClientSession(loop=loop) + __session_pool[loop] = session + + return session def set_session(session: aiohttp.ClientSession): @@ -184,8 +182,8 @@ def set_session(session: aiohttp.ClientSession): Args: session (aiohttp.ClientSession): aiohttp.ClientSession 实例。 """ - global __session - __session = session + loop = asyncio.get_event_loop() + __session_pool[loop] = session def to_form_urlencoded(data: dict) -> str: diff --git a/bilibili_api/utils/sync.py b/bilibili_api/utils/sync.py index 1eaa176..9439277 100644 --- a/bilibili_api/utils/sync.py +++ b/bilibili_api/utils/sync.py @@ -1,6 +1,13 @@ from typing import Coroutine import asyncio +def __ensure_event_loop(): + try: + asyncio.get_event_loop() + + except: + asyncio.set_event_loop(asyncio.new_event_loop()) + def sync(coroutine: Coroutine): """ @@ -12,6 +19,7 @@ def sync(coroutine: Coroutine): Returns: 该异步函数的返回值 """ + __ensure_event_loop() loop = asyncio.get_event_loop() return loop.run_until_complete(coroutine) diff --git a/setup.py b/setup.py index d286cc4..3b64a8f 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setuptools.setup( name='bilibili-api', - version='9.0.1', + version='9.0.2', license='GPLv3+', author='MoyuScript', description='哔哩哔哩的各种 API 调用便捷整合(视频、动态、直播等),另外附加一些常用的功能。',