请欣赏下面的代码是今天生产中的代码的摘录,因此已经做了修改以引入遇到的问题。从 aiolimiter 导入 AsyncLimiter 类
请理解,下面的代码是今天生产中的代码的摘录,因此已经进行了修改以介绍遇到的问题。
from aiolimiter import AsyncLimiter
class ServiceCrawler:
def __init__(self, ratelimit: int = 0) -> None:
self.base_url = "https://app.myservice.com/api/"
self.http_client = HTTPClient(self._access_token, ratelimit)
self._ratelimit = AsyncLimiter(ratelimit, 30)
async def get_something(): ...
async def get_something_else(): ...
上述类是一个专门为查询内部 API 而构建的对象,旨在以异步模式工作。
就目前情况而言,我有外部例程创建一组协同程序来启动我的内部方法并处理数据。每个请求都会创建一个新的 ServiceCrawler 对象,我认为用 Singleton 模式封装它会很好。是否使用元类、全局变量来执行此操作......这是一个不同的故事。
在使用了不同的方法后,我发现没有带来任何好处,事实上执行效果大幅下降,这是我无法理解的。
举例来说,使用全局变量的以下实现。
def __init__(self, ratelimit: int = 0) -> None:
self.base_url = "https://app.myservice.com/api/"
self.http_client = HTTPClient(self._access_token, ratelimit)
self._ratelimit = AsyncLimiter(ratelimit, 30)
global client
if not client:
self.http_client = HTTPClient(self._access_token, ratelimit)
client = self.http_client
else:
self.http_client = client
代码一到位,我的例程就突然需要半分钟才能相互调用。现在我想知道这是否是由于单例方法与异步不兼容,或者是否还有其他我需要识别的东西,但目前我还不知道。
感谢您对如何在负责进行 API 调用的异步对象上更好地实现单例模式的任何提示。