Pyramid 全局对象跨线程共享

Pyramid global object share across thread

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

我还有一个 python class 可以创建项目索引和快速搜索方法。类似于:

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)

我想把上面的class公开给我的api。

我只能创建一个 class(内存限制)的实例。

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

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

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

将您的 class 实例添加到全局 application registry during your Pyramid application's configuration:

config.registry.mycorpus = MyCorpus()

以后,例如在您的视图代码中,通过请求访问它:

request.registry.mycorpus

您也可以使用 registry.registerUtility 将其注册为 Zope Component Architecture 的实用程序,但您需要定义 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)

任何全局变量都在 Python 中的线程之间共享,因此这部分非常简单:“...只创建一个 class 的实例...在服务器启动之前... . 线程应该能够访问它":

corpus = MyCorpus()  # in global scope in any module

完成!然后从任何地方导入实例并调用您的 class' 方法:

from mydata import corpus

corpus.do_stuff()

不需要 ZCA,纯 pythonic Python :)

(在网络服务器进程中保留大型且非常类似于数据库的一般方法感觉很可疑,我希望你知道你在做什么。我的意思是 - 持久性?锁定?共享多个进程之间的数据?Redis,MongoDB 和 1001 其他数据库产品解决了这些问题)