这个单例的python模式是否安全?

时间:2016-09-08 06:03:39

标签: python singleton python-module

我有一个处理获取和设置到redis集群的模块R.它被导入烧瓶api的端点。我的第一个想法是在R中使用Singleton类,以便我们保持与redis集群的单一连接,但我并不完全是我应该将单例类模式放入代码库中,该代码库每年只查看一次开发人员,我真的不希望有人试图在稍后阶段多次实例化它。

所以,相反,在我的模块 init .py中我设置了与集群的连接,并将此连接导入我的redis集群模块,然后我使用R,连接始终是相同的连接,而不必使用单身人士。

e.g:

_init _.py:

 try:
 RedisConnection = ConnectionMaker(...)

- [R 的.py:

from ...caching import RedisConnection
...
def set_cache():
    RedisConnection.set(....)

some_endpoint.py

 from ....caching import set_cache, ...

some_other_endpoint.py

 from ....caching import set_cache, ...

我认为这是安全的,因为'Since Python modules are first-class runtime objects, they effectively become singletons, initialized at the time of first import.'。但是,有什么我想念的,有什么危险吗?

1 个答案:

答案 0 :(得分:1)

这是安全的,但有两件事我认为不是好的做法。

  1. 不应该有初始化或类定义等 init.py Init文件用于隐藏包的内部结构。 一个简单的 init .py是一个很好的 init .py
  2. 在全球空间中创建对象并不好。缺点是仅仅导入包会占用内存,因为它初始化了一个对象。您应该在类或函数内部进行实际连接。无论何时需要连接,都要调用此类或函数来创建单例连接。