簡體   English   中英

python模式的單例安全嗎?

[英]Is this python pattern for a singleton safe?

我有一個模塊R來處理獲取和設置到Redis集群。 它會在Flask API的所有端點上導入。 我的第一個想法是在R中使用Singleton類,以便我們保持與Redis集群的單個連接,但是我不完全應該將Singleton類模式放入每年僅一次由不同人員查看的代碼庫中。開發人員,我真的不希望有人在以后的階段嘗試多次實例化它。

因此,相反,在模塊init .py中,我建立了到集群的連接,並將此連接導入到我的redis集群模塊中,然后無論我使用R為何,該連接始終是相同的連接,而不必使用單例。

例如:

_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, ...

我認為這是安全的,因為' 由於Python模塊是一流的運行時對象,因此它們實際上成為單例,並在首次導入時進行了初始化。 '。 但是,我有什么想念的,有危險的嗎?

這是安全的,但有兩點我認為不是好的做法。

  1. init.py中不應存在初始化或類定義等信息。Init文件用於隱藏包的內部結構。 一個簡單的初始化的.py是一個很好的初始化的.py
  2. 在全局空間中創建對象不是很好。 缺點是僅導入軟件包會因為初始化對象而消耗內存。 您應該在類或函數內部進行實際連接。 每當需要連接時,都可以調用此類或函數來創建單例連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM