跨线程的金字塔全局对象共享

gos*_*som 4 python pyramid

我有一个小金字塔网络服务.

我还有一个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.

我只能创建该类的一个实例(内存限制).

所以我需要能够在服务器启动之前实例化这个类.我的线程应该能够访问它.

我还需要一些锁定机制(不支持并发插入).

实现这一目标的最佳方法是什么?

Ilj*_*ilä 6

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)