Skip to content

Commit 68517b8

Browse files
author
veehou
committed
fix: 解决并发消息请求出现的timeout问题
1 parent 2eae3cb commit 68517b8

File tree

3 files changed

+33
-23
lines changed

3 files changed

+33
-23
lines changed

botpy/client.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ def __init__(
6363
self._ws_ap: Dict = {}
6464

6565
logging.configure_logging(
66-
config=log_config, _format=log_format, level=log_level, bot_log=bot_log, ext_handlers=ext_handlers
66+
config=log_config,
67+
_format=log_format,
68+
level=log_level,
69+
bot_log=bot_log,
70+
ext_handlers=ext_handlers,
6771
)
6872

6973
async def __aenter__(self):
@@ -94,8 +98,6 @@ async def close(self) -> None:
9498

9599
self._closed = True
96100

97-
await self.http.close()
98-
99101
def is_closed(self) -> bool:
100102
return self._closed
101103

@@ -126,7 +128,6 @@ async def runner():
126128

127129
try:
128130
self.loop.run_until_complete(runner())
129-
self.loop.run_forever()
130131
except KeyboardInterrupt:
131132
return
132133

@@ -272,6 +273,7 @@ async def _run_event(
272273
**kwargs: Any,
273274
) -> None:
274275
try:
276+
_log.debug("[botpy] _run_event")
275277
await coro(*args, **kwargs)
276278
except asyncio.CancelledError:
277279
pass

botpy/http.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import Any, Optional, ClassVar, Union, Dict
66

77
import aiohttp
8-
from aiohttp import ClientResponse, FormData, ClientTimeout, TCPConnector
8+
from aiohttp import ClientResponse, FormData, TCPConnector
99

1010
from . import logging
1111
from .errors import HttpErrorDict, ServerError
@@ -76,33 +76,27 @@ class BotHttp:
7676
TODO 增加并发请求的锁控制 @veehou
7777
"""
7878

79-
def __init__(self, timeout: int, is_sandbox: bool = False, app_id: str = None, token: str = None):
79+
def __init__(
80+
self,
81+
timeout: int,
82+
is_sandbox: bool = False,
83+
app_id: str = None,
84+
token: str = None,
85+
):
8086
self.timeout = timeout
8187
self.is_sandbox = is_sandbox
8288

8389
self._token: Optional[Token] = None if not app_id else Token(app_id=app_id, access_token=token)
84-
self._session: Optional[aiohttp.ClientSession] = None
8590
self._global_over: Optional[asyncio.Event] = None
8691
self._headers: Optional[dict] = None
8792

88-
async def close(self) -> None:
89-
if self._session:
90-
await self._session.close()
91-
9293
async def check_session(self):
9394
if not self._headers:
9495
self._headers = {
9596
"Authorization": f"{self._token.get_type()} {self._token.get_string()}",
9697
"User-Agent": "botpy/v1",
9798
}
9899

99-
if not self._session or self._session.closed:
100-
self._session = aiohttp.ClientSession(
101-
headers=self._headers,
102-
timeout=ClientTimeout(self.timeout),
103-
connector=TCPConnector(limit=500, ssl=SSLContext()),
104-
)
105-
106100
async def request(self, route: Route, **kwargs: Any):
107101
# some checking if it's a JSON request
108102
if "json" in kwargs:
@@ -113,7 +107,7 @@ async def request(self, route: Route, **kwargs: Any):
113107
for k, v in kwargs.pop("json").items():
114108
if v:
115109
if isinstance(v, dict):
116-
if k == 'message_reference':
110+
if k == "message_reference":
117111
_log.error(
118112
f"[botpy] 接口参数传入异常, 请求连接: {route.url}, "
119113
f"错误原因: file_image与message_reference不能同时传入,"
@@ -126,8 +120,19 @@ async def request(self, route: Route, **kwargs: Any):
126120
route.is_sandbox = self.is_sandbox
127121
_log.debug(f"[botpy] 请求头部: {self._headers}, 请求方式: {route.method}, 请求url: {route.url}")
128122

129-
async with self._session.request(method=route.method, url=route.url, **kwargs) as response:
130-
return await _handle_response(response)
123+
async with aiohttp.ClientSession(
124+
headers=self._headers, connector=TCPConnector(limit=500, ssl=SSLContext())
125+
) as session:
126+
_log.debug(session)
127+
128+
async with session.request(
129+
method=route.method,
130+
url=route.url,
131+
timeout=(aiohttp.ClientTimeout(total=self.timeout)),
132+
**kwargs,
133+
) as response:
134+
_log.debug(response)
135+
return await _handle_response(response)
131136

132137
async def login(self, token: Token) -> robot.Robot:
133138
"""login后保存token和session"""

examples/demo_at_reply.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# -*- coding: utf-8 -*-
2+
import asyncio
23
import os
34

45
import botpy
56
from botpy import logging
6-
7-
from botpy.message import Message
87
from botpy.ext.cog_yaml import read
8+
from botpy.message import Message
99

1010
test_config = read(os.path.join(os.path.dirname(__file__), "config.yaml"))
1111

@@ -18,6 +18,9 @@ async def on_ready(self):
1818

1919
async def on_at_message_create(self, message: Message):
2020
_log.info(message.author.avatar)
21+
if "sleep" in message.content:
22+
await asyncio.sleep(10)
23+
_log.info(message.author.username)
2124
await message.reply(content=f"机器人{self.robot.name}收到你的@消息了: {message.content}")
2225

2326

0 commit comments

Comments
 (0)