是Python中使用全局变量是线程安全的?
题
编辑:即时通讯,询问是否全局变量像龙卷风单线程的web框架是安全的。
使用mongoengine ORM,它得到从一个全局变量数据库连接IM:
_get_db() # gets the db connection
IM也使用龙卷风,单线程Python网络框架。在一个特定的视图中,我需要抓住一个数据库连接和取消引用DBRef
对象[类似于外键]:
# dereference a DBRef
_get_db().dereference(some_db_ref)
由于由_get_db
返回的连接是一个全局变量,是否有碰撞的可能性和错误的值被返回到错误的线程?
解决方案
假设MongoEngine被包裹PyMongo(我相信它是),则你应该罚款。 PyMongo是完全线程安全的。
其他提示
螺纹总是需要与Python对象交互时保持GIL。命名空间持变量是一个Python对象(无论是frameobject或快译通,这取决于它是什么类型的变量。)它总是安全的获取或在多线程设置的变量。你将永远不会得到垃圾数据。
但是,通常的比赛条件不适用,你得到的,或者哪个对象,当你分配给你更换到哪些对象。像x += 1
语句是的不的线程安全的,因为不同的线程可以在获取和存储之间运行,改变x
,你会用它覆盖的值。
没有,但锁是非常简单的python使用。使用try:最后:模式以确保锁被释放您修改全局变量后
有大约全局什么,使他们比任何其他变量的任何或多或少线程安全的。无论是否有可能为一个操作失败,或在不同的线程中运行时返回不正确的结果,最好的做法是,你应该的保护线程之间共享的数据。的
如果我读你的权利,你问如果一个变量是在单线程环境是安全的。在这种情况下,其中数据是不的并发进程之间共享,该变量是安全的(毕竟,没有什么别的运行可能会中断的话)。
不隶属于 StackOverflow