我们有一个围绕suds(SOAP)请求的包装器,我们在整个应用程序中都这样使用:
from app.wrapper import ByDesign
bd = ByDesign()
不幸的是,这个实例化是在每个请求的几个点上进行的,导致suds重新下载WSDL文件,我想我们可以通过让bd = ByDesign()
返回一个单例来节省一些时间。
由于suds不是线程安全的,因此每个请求必须是一个单身。
唯一的问题是,我想这样做,所以我不必更改除app.wrapper.ByDesign
类之外的任何代码,这样我就不必更改任何调用它的代码。如果没有'每个请求的单身人士'要求,我会做这样的事情:
class ByDesignRenamed(object):
pass
_BD_INSTANCE = None
def ByDesign():
global _BD_INSTANCE
if not _BD_INSTANCE:
_BD_INSTANCE = ByDesignRenamed()
return _BD_INSTANCE
但是,这在线程服务器环境中不起作用。对我有什么想法吗?
答案 0 :(得分:9)
查看threading.local(),它介于纯粹邪恶之间,是实现目标的唯一途径。应该是这样的:
import threading
_local = threading.local()
def ByDesign():
if 'bd' not in _local.__dict__:
_local.bd = ByDesignRenamed()
return _local.bd
进一步阅读: