Python的通用代理和池类
项目描述
代理模式池
Python的通用代理和池类。
此模块提供了两个类
-
Proxy实现了代理模式,即代理上的所有方法调用都转发到内部包装的对象。这允许解决Python模块的经典鸡生蛋导入和初始化可能存在的循环依赖问题# File "database.py" db = Proxy() def init_app(config): db.set_obj(initialization from config)
# File "app.py" import database from database import db # db is a proxy to nothing … # delayed initialization database.init_app(config) # db is now a proxy to the initialized object
-
Pool实现了一个线程安全的对象池,可用于存储创建成本高昂的对象,例如数据库连接。上面的代理对象根据其参数自动创建池。使用完毕后,请调用
db._ret_obj()将对象返回到池中。
文档
Proxy类管理对一个或多个对象的访问,可能使用Pool,具体取决于这些对象的预期范围。
Proxy构造函数期望以下参数
obj一个在所有线程之间共享的单个对象。fun一个函数,每次需要时调用对象创建,用于THREAD和VERSATILE范围。scope对象范围,由Proxy.Scope定义SHARED一个共享对象(进程级别)THREAD每个线程一个对象(threading实现)WERKZEUG每个greenlet一个对象(werkzeug实现)EVENTLET每个greenlet一个对象(eventlet实现)GEVENT每个greenlet一个对象(gevent实现)VERSATILE等同于WERKZEUG,默认是SHARED或THREAD,取决于是否为对象传递了函数对象。
set_name设置代理内容的函数名称,默认是set。此参数允许避免与代理方法冲突。它用作前缀,以拥有set_obj和set_fun函数,这些函数允许重置内部的obj或fun。log_level设置日志级别,默认 None 表示不设置。max_size池的大小,默认 None 表示没有池。max_size和其他所有参数都转发到Pool。
当 max_size 不是 None 时,创建一个 Pool 来存储创建的对象以便重用。当不再需要对象时,通过显式调用 _ret_obj 来返回对象是用户的责任。这对于不断创建新线程的代码很有用,例如 werkzeug。对于数据库连接,在 commit 之后进行操作是一个很好的时间点。
代理有一个 _has_obj 方法来测试对象是否可用,而无需从池中提取任何内容:这在某些错误处理模式中测试是否需要返回对象时很有用。
Pool 类以线程安全的方式管理对象池。其构造函数期望以下参数
fun创建新对象的方式;函数传递创建编号。max_size池的最大大小,0 表示无限。min_size池的最小大小。timeout等待某物的最大时间。max_use使用多少次后丢弃对象。max_avail_delay何时丢弃未使用的对象。max_using_delay何时警告长时间保留对象。max_using_delay_kill何时杀死长时间保留的对象。health_freq在每个守护进程回合中运行健康检查。hk_delay强制清理延迟。log_level设置日志级别,默认 None 表示不设置。opener在创建对象时调用的函数,默认 None 表示不调用。getter在获取对象时调用的函数,默认 None 表示不调用。retter在返回对象时调用的函数,默认 None 表示不调用。closer在丢弃对象时调用的函数,默认 None 表示不调用。stats生成用于统计的 JSON 兼容结构的函数。health检查可用对象健康的函数。tracer对象调试辅助工具,默认 None 表示更少的调试。
根据需要通过调用 fun 来按需创建对象。
代理示例
以下是一个具有蓝图和共享资源的 flask 应用的示例。
首先,一个共享模块持有对一个尚不知道的对象的代理
# file "Shared.py"
from ProxyPatternPool import Proxy
stuff = Proxy()
def init_app(s):
stuff.set_obj(s)
此共享对象被具有蓝图的模块使用
# file "SubStuff.py"
from Flask import Blueprint
from Shared import stuff
sub = Blueprint(…)
@sub.get("/stuff")
def get_stuff():
return str(stuff), 200
然后,应用程序本身可以按任何顺序加载和初始化这两个模块,而不会存在某些未初始化的导入风险
# file "App.py"
from flask import Flask
app = Flask("stuff")
from SubStuff import sub
app.register_blueprint(sub, url_prefix="/sub")
import Shared
Shared.init_app("hello world!")
注意
此模块是修辞性的:由于 GIL,Python 在并行语言方面相当糟糕,因此创建将主要无法并行运行的线程的目的毫无意义,因此这些线程共享的智能池的目的甚至更加无意义!
共享对象 必须 返回到池中,以避免耗尽资源。这可能需要来自基础设施的一些积极合作,这可能或可能不可靠。考虑监控您的资源以检测意外状态,例如数据库连接保持 事务空闲 状态等。
另请参阅
- Psycopg Pool,用于池化 Postgres 数据库连接。
- Eventlet db_pool,用于池化 MySQL 或 Postgres 数据库连接。
- 关于数据库池大小的讨论(剧透:小的是美丽的)。
许可证
此代码属于公有领域。
所有软件都有bug,这是软件,所以……小心,你可能会因此失去头发或朋友。如果你喜欢它,请随时给作者寄张明信片。
版本
项目详情
下载文件
下载适用于您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。
源代码分发
构建分发
proxypatternpool-11.1.tar.gz的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 8a57dc796636755e1df74d71a7c7b49da39179f572e208166365057480bb892f |
|
| MD5 | 6107c7cfdb39a8eb3353ae024616f1f0 |
|
| BLAKE2b-256 | 8378dc8bb340489fc0b21798ad604cfad8c891411fdb8eb3567ae1173d2adf80 |
ProxyPatternPool-11.1-py3-none-any.whl的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | cf9719920cc980b81ebf4a9922416c6bedfc2c7c7a421bcefcdc31a27a9b280b |
|
| MD5 | 351d4f7ded911911b022062d5f4ec4f6 |
|
| BLAKE2b-256 | acaba0e0575ee3d36c90cf5a563f3131d52177af514aac741d834bb5cec17424 |