我有一个小金字塔网络服务.
我还有一个python类,它创建了一个项目和方法的索引,可以快速搜索它们.就像是:
class MyCorpus(object):
def __init__(self):
self.table = AwesomeDataStructure()
def insert(self):
self.table.push_back(1)
def find(self, needle):
return self.table.find(needle)
Run Code Online (Sandbox Code Playgroud)
我想把上面的课程暴露给我的api.
我只能创建该类的一个实例(内存限制).
所以我需要能够在服务器启动之前实例化这个类.我的线程应该能够访问它.
我还需要一些锁定机制(不支持并发插入).
实现这一目标的最佳方法是什么?
在Pyramid应用程序的配置期间,将您的类的实例添加到全局应用程序注册表:
config.registry.mycorpus = MyCorpus()
Run Code Online (Sandbox Code Playgroud)
然后,例如在您的视图代码中,通过请求访问它:
request.registry.mycorpus
Run Code Online (Sandbox Code Playgroud)
您也可以使用Zope Component Architecture将其注册为实用程序registry.registerUtility,但是您需要定义哪个接口MyCorpus提供等等,从长远来看这是一件好事.无论是将单例实例作为注册表的一部分,都可以更轻松地测试应用程序; 只需使用模拟语料库创建配置.
任何锁定都应由实例本身处理:
from threading import Lock
class MyCorpus(object):
def __init__(self, Lock=Lock):
self.table = AwesomeDataStructure()
self.lock = Lock()
...
def insert(self):
with self.lock:
self.table.push_back(1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |