实现单例类及其锁定问题?

4 投票
4 回答
687 浏览
提问于 2025-04-16 12:35

我在考虑如何实现一个单例类,参考了这个链接:http://code.activestate.com/recipes/52558-the-singleton-pattern-implemented-with-python/。不过我有点担心会遇到锁定问题。我的代码是用来缓存SQL语句的,当缓存的元素达到一定数量,或者用户执行特定的调用时,就会通过cursor.executemany(SQL, list-of-params)来执行所有缓存的语句。实现单例的目的是为了在整个应用中都能缓存这些语句,但我担心会出现锁定的问题。

大家有什么想法吗?

4 个回答

0

如果你不打算在多个线程中使用那个单例实例,应该是没有问题的。

最近我遇到了一些问题,是因为缓存重新加载的机制实现得不对——缓存数据先被清空,然后再填充。这在单线程中运行得很好,但在多线程中就会出现错误。

1

为什么不直接使用这个模块呢?之前提到过,模型是单例模式。假设你创建了一个这样的模块:

# mymodule.py
from mydb import Connection
connection = Connection('host', 'port')

你可以使用导入机制,这样connection实例在任何地方都是一样的。

from mymodule import connection

当然,你可以定义一个更复杂的connection初始化方式(可能是通过自己写一个类),但关键是Python只会初始化这个模块一次,并且在后续的调用中提供相同的对象。

我认为单例模式(或者叫Borg模式)在Python中有非常特定的应用场景,大多数情况下你应该依赖直接导入,直到有其他证明为止。

1

通过避免懒加载,阻塞的问题就会消失。在一个模块中,如果你要初始化与数据库的连接,先导入包含单例的模块,然后立即创建一个单例的实例,但不要把这个实例存储在变量里。

#Do Database Initialization
import MySingleton
MySingleton()
#Allow threads to be created

撰写回答