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

时间:2016-06-23 11:40:02

标签: 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)

我想将上述课程公开给我的api。

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

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

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

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

2 个答案:

答案 0 :(得分:6)

application registry

期间,将您的课程实例添加到全球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)

答案 1 :(得分:2)

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

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

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

from mydata import corpus

corpus.do_stuff()

不需要ZCA,普通的pythonic Python:)

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