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 |