我想知道在http://code.activestate.com/recipes/52558-the-singleton-pattern-implemented-with-python/之后实现单例类,但是想知道任何(b)锁定问题。我的代码假设在达到一定数量的缓存元素或用户完成特定的执行调用时,使用cursor.executemany(SQL,list-of-params)缓存SQL语句并执行所有缓存的语句。假设实现单例可以在应用程序范围内缓存语句,但我m afraid I
会遇到(b)锁定问题。
有什么想法吗?
答案 0 :(得分:1)
通过避免延迟初始化,阻塞问题将消失。在一个初始化数据库连接的模块中,导入包含单例的模块,然后立即创建一个未存储在变量中的单例实例。
#Do Database Initialization
import MySingleton
MySingleton()
#Allow threads to be created
答案 1 :(得分:1)
为什么不直接使用模块(如前所述,模型是单例)。如果您创建一个类似的模块:
# mymodule.py
from mydb import Connection
connection = Connection('host', 'port')
您可以使用导入机制,connection
实例在任何地方都是相同的。
from mymodule import connection
当然,您可以定义更复杂的connection
初始化(可能通过编写自己的类),但重点是Python只会初始化模块一次,并为每个后续项提供相同的对象呼叫。
我认为Singleton(或Borg)模式在Python中具有非常特定的应用程序,并且在大多数情况下,您应该依赖直接导入,直到证明不是这样。
答案 2 :(得分:0)
除非您计划将Singleton实例与多个线程一起使用,否则应该没有问题。
最近我遇到了由错误实现的缓存重新加载机制引起的一些问题 - 首先清除缓存数据然后填充。这在单线程中运行良好,但在多线程中会产生错误。
答案 3 :(得分:0)
只要您使用CPython - Global Interpreter Lock就可以防止阻塞问题。您也可以使用Borg pattern。