使用在python和scala中创建的相同redis池实例

使用在python和scala中创建的相同redis池实例,python,scala,apache-spark,redis,Python,Scala,Apache Spark,Redis,我已经用python中的singleton设计模式创建了redis池实例 class RedisPool: pool = None @classmethod def get_connection_pool(cls, startup_nodes): if cls.pool == None: cls.pool = ConnectionPool(host = startup_nodes['host'], port = startup_no

我已经用python中的singleton设计模式创建了redis池实例

class RedisPool:
    pool = None
    @classmethod
    def get_connection_pool(cls, startup_nodes):
        if cls.pool == None:
            cls.pool = ConnectionPool(host = startup_nodes['host'], port = startup_nodes['port'], db = 0, password = startup_nodes['password'])
        return cls.pool

正如我从redis文档中了解到的,我们应该有单池实例,这就是我们使用单池实例的原因。然而,python脚本中的一个流使用spark submit执行scala脚本,该脚本使用redis连接转储一些数据。如何使用在python脚本中创建的相同池实例来使用scala中的实例。

否,scala脚本无法重用python中定义的连接池

class RedisPool:
    pool = None
    @classmethod
    def get_connection_pool(cls, startup_nodes):
        if cls.pool == None:
            cls.pool = ConnectionPool(host = startup_nodes['host'], port = startup_nodes['port'], db = 0, password = startup_nodes['password'])
        return cls.pool
Python的连接池仅在单个进程中有效。当您从python调用scala脚本时,实际上是在启动一个新进程。此新进程无权访问连接池

您必须将redis主机/端口/密码从python传递到scala,并且您的scala脚本必须创建到redis的另一个连接


为了改善这一点,您可以使用scala进程自己的连接池使其自身具有较长的使用寿命。然后公开一些api供python进程调用。

如果有人对问题投反对票并提到这样做的原因,那就更好了。这将有助于我学习,因为我对这一点还不熟悉。你可能会想知道——为什么会有反对票?。原因是这个问题是由非常基本的错误概念驱动的。简单地说,如果一个程序是《罗密欧与朱丽叶》的剧本,那么一个正在运行的程序中的一个实例就可以被认为是《罗密欧与朱丽叶》剧本中罗密欧的实例。现在,这个特定的罗密欧不能被转移到其他的剧本中,因为这个罗密欧不存在,没有一个正在运行的剧本和该剧之外的剧本。正如你应该能够理解的那样,在一部正在上演的《罗密欧与朱丽叶》剧中,你不需要不止一个罗密欧。现在,把另一家剧团想象成一种不同的语言,它们的剧本在功能上是相同的,但在结构和美学上存在一些差异。与你的剧团相比,他们将有不同的演员扮演相同的角色。不用说,你们剧团的一部连续剧《罗密欧》中的罗密欧在这家剧团的连续剧《罗密欧》中什么都做不了。@SarveshKumarSingh谢谢你给我写了OOPS的基础知识,但我已经知道了这一点。此外,你的例子是无效的,因为单个演员可以在法语和英语电影中扮演罗密欧,即不同语言的电影,或者无论是不同的公司,或者是结构和美学上的差异,只要他是唯一的人,在我们的例子中,如果有某种我可以从redis获得的唯一id,我可以在其中使用python和scala是我的意思,没有其他方法。没有必要用另一种方式。为什么??;你应该调查一下为什么它建议使用一个游泳池,以及这个游泳池到底是什么。谢谢你的回复。为了进一步阐明我所想的方法,我是否可以在每次完成redis处理时销毁池,并在每次需要连接时创建一个新池,这样会变得效率低下?