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

2024-10-04 09:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

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

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


Tags: 实例方法selfobjectinitdeftablefind
2条回答

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

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

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

^{pr2}$

不需要ZCA,纯Python Python:)

(在web服务器进程中保存大型和非常数据库之类的东西的一般方法感觉很可疑,但我希望您知道自己在做什么。我是说-坚持?锁定?在多个进程之间共享数据?Redis、MongoDB和1001其他数据库产品解决了这些问题)

Pyramid application's configuration期间将类的实例添加到全局application registry

config.registry.mycorpus = MyCorpus()

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

^{pr2}$

您也可以使用registry.registerUtility将其注册为Zope Component Architecture实用程序,但您需要定义MyCorpus提供的接口等,从长远来看这是一件好事。不管是哪种方式,将singleton实例作为注册表的一部分,都会使测试应用程序更容易;只需使用模拟语料库创建一个配置。在

任何锁定都应该由实例本身处理:

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)

相关问题 更多 >