Pythonic线程安全对象

时间:2011-09-06 15:24:42

标签: python multithreading object global

在阅读了很多关于这个主题并讨论IRC之后,回应似乎是:远离线程。很抱歉重复这个问题,我的目的是通过不接受“线程是邪恶的”答案来深入探讨这个问题,并希望找到一个共同的解决方案。

编辑:对锁定,死锁,锁粒度,活锁,非确定性和竞争条件的综合弊端说不。 --Guido van Rossum

我正在开发一个Python Web应用程序,我想为每个用户创建一个全局对象只能由当前用户访问。 (例如请求的URI)

建议的方法是传递对象,IMO使应用程序更难维护,如果我在不同的地方需要相同的值(有些可能是第三方插件),则不是漂亮的代码。

我看到许多流行的框架(Django,CherryPy,Flask)使用Python线程锁来解决问题。 如果所有这些框架都违背了Pythonic方式并且感觉需要创建一个全局可访问的对象,那就意味着社区需要这样的东西。我也是。

传递物体的“最佳”方式是什么? 是使用“邪恶”线程锁的唯一替代解决方案吗? 将此信息存储在数据库或memcached中会更加Pythonic吗?

提前致谢!

1 个答案:

答案 0 :(得分:5)

如果您不想锁定,则要么不使用全局变量,要么使用线程本地存储(在Web应用程序中,您可以相当确定请求不会跨越线程边界)。如果可以避免全球状态,则应该避免。这使得多线程方式更易于实现和调试。

我也不同意传递对象会使应用程序更难维护 - 通常是另一种方式 - 除了需要仔细同步之外,全局状态还隐藏了依赖关系。

嗯,还有无锁等方法,比如STM或诸如此类的东西,但它可能对网络应用程序来说太过分了。