如何解决Django:每个请求单身吗?
| 我们有一个围绕suds(SOAP)请求的包装器,我们在整个应用程序中都使用了以下包装器:from app.wrapper import ByDesign
bd = ByDesign()
不幸的是,每个请求在几个点上进行了这种实例化,从而使肥皂水重新下载了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
但是,这在线程服务器环境中不起作用。对我有什么想法吗?
解决方法
看看threading.local(),它介于纯粹的邪恶和使事情发展的唯一途径之间。可能应该是这样的:
import threading
_local = threading.local()
def ByDesign():
if \'bd\' not in _local.__dict__:
_local.bd = ByDesignRenamed()
return _local.bd
进一步阅读:
为什么在Django中使用线程本地变量不好?
Python中的线程局部变量-关于可伸缩性是否定的?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。