编辑:即时通讯,询问是否全局变量像龙卷风单线程的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:最后:模式以确保锁被释放您修改全局变量后

有大约全局什么,使他们比任何其他变量的任何或多或少线程安全的。无论是否有可能为一个操作失败,或在不同的线程中运行时返回不正确的结果,最好的做法是,你应该的保护线程之间共享的数据。

如果我读你的权利,你问如果一个变量是在单线程环境是安全的。在这种情况下,其中数据是的并发进程之间共享,该变量是安全的(毕竟,没有什么别的运行可能会中断的话)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top