Python全局变量是否是线程安全的?

时间:2010-02-11 22:58:00

标签: python mongodb tornado

编辑:即时询问全局变量在龙卷风等单线程Web框架中是否安全

即时通讯使用mongoengine orm,它从全局变量获取数据库连接:

_get_db() # gets the db connection
我也使用龙卷风,一个单线程的python web框架。在一个特定的视图中,我需要获取数据库连接并取消引用DBRef对象[类似于外键]:

# dereference a DBRef
_get_db().dereference(some_db_ref)

因为_get_db返回的连接是一个全局var,是否有可能发生冲突并且错误的值被返回到错误的线程?

4 个答案:

答案 0 :(得分:3)

在与Python对象交互时,始终需要线程来保存GIL。保存变量的命名空间是一个Python对象(框架对象或字典,取决于它是什么类型的变量。)在多个线程中获取或设置变量总是安全的。你永远不会得到垃圾数据。

但是,通常的竞争条件确实适用于您获得的对象,或者在分配时替换的对象。像x += 1这样的语句是线程安全的,因为get和store之间可以运行不同的线程,更改x的值,然后覆盖它。

答案 1 :(得分:2)

假设MongoEngine正在包装PyMongo(我相信它是),那么你应该没问题。 PyMongo完全是线程安全的。

答案 2 :(得分:1)

不,但在python中使用锁非常简单。使用try:finally:pattern确保在修改全局变量后释放锁。

答案 3 :(得分:0)

没有任何关于全局变量的东西使得它们比任何其他变量更多或更少的线程安全。在不同的线程中运行时,操作是否可能失败或返回错误的结果,最佳做法是保护线程之间共享的数据。

如果我正确地读你,你会问一个变量在单线程环境中是否安全。在这种情况下,如果数据在并发进程之间没有 共享,那么该变量是安全的(毕竟,没有其他任何可能会中断它的东西)。