5

编辑:我询问全局变量在像龙卷风这样的单线程网络框架中是否安全

我正在使用 mongoengine orm,它从全局变量获取数据库连接:

_get_db() # gets the db connection

我也在使用 tornado,一个单线程的 python web 框架。在一个特定的视图中,我需要获取一个数据库连接并取消引用一个DBRef对象[类似于外键]:

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

由于返回的连接_get_db是全局变量,是否有可能发生冲突并将错误的值返回到错误的线程?

4

4 回答 4

3

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

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

于 2010-02-11T23:13:05.073 回答
2

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

于 2010-02-12T02:03:12.417 回答
1

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

于 2011-04-18T16:07:57.410 回答
0

与其他任何变量相比,全局变量并没有使它们或多或少具有线程安全性。无论在不同线程中运行时操作是否可能失败或返回错误结果,最佳实践是您应该保护线程之间共享的数据。

如果我没看错,你是在问一个变量在单线程环境中是否安全。在这种情况下,并发进程之间共享数据,变量是安全的(毕竟,没有其他运行可能会中断它)。

于 2010-02-11T23:31:36.743 回答