gpt4 book ai didi

对象池设计模式的 Python 实现

转载 作者:IT老高 更新时间:2023-10-28 20:53:15 26 4
gpt4 key购买 nike

我需要一个 Object Pool ,而不是自己实现它,我想我会四处寻找一个现成且经过测试的 Python 库。

我发现很多其他人 looking ,但没有得到很多直接的答案,所以我把它带到了 Stack Overflow。

就我而言,我有大量线程(使用 threading 模块),这些线程需要偶尔调用基于 SOAP 的远程服务器。他们每个人都可以建立自己与服务器的连接,但是设置一个套接字并完成身份验证过程很昂贵(它受到服务器的限制),所以我想共享一个连接池,只在需要时创建更多。

如果要池化的项目是工作子进程,我可能会选择 multiprocessing.pool,但事实并非如此。如果它们是工作线程,我可能会选择 this implementation ,但它们不是。

如果它们是 MySQL 连接,我可能会选择 pysqlpool ,但它们不是。同样的 SQLAlchemy Pool出来了。

如果有一个线程,使用可变数量的连接/对象,我会考虑 this implementation ,但我需要它是线程安全的。

我知道我可以很快再次实现它,但鉴于有很多人在寻找它,我认为 Stack Overflow 上的规范答案会很好。

最佳答案

在我看来,根据您的描述,您需要的是一个连接 池,而不是对象。为了简单的线程安全,只需将可重用连接保留在 Queue.Queue 实例中,称为 pool。当一个线程实例化一个连接包装对象时,该对象通过 pool.get() 获得它的连接(如果当前没有可用的连接,它会自动将其入队等待,并在连接准备好时将其出列它);当对象完成使用其连接时,它会通过 pool.put 将其放回池中。

除了 Queue.Queue 已经为您提供的功能之外,其中几乎没有普遍需要的通用功能,因此没有模块提供众所周知或流行的功能也就不足为奇了——很难当一个模块总共有大约 6 行功能代码时(例如,调用用户提供的连接工厂以提前或及时填充队列直到某个最大数量 - 不是一个很大的附加值)一般来说,无论如何)。 “厚胶”,从标准库模块中厚厚地包装底层功能而没有实质性的附加值,毕竟是一种架构上的缺点;-)。

关于对象池设计模式的 Python 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com