agi*_*liq 21 python django thread-local
每个人都在Django世界似乎恨threadlocals(http://code.djangoproject.com/ticket/4280,http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser).我读过Armin的论文(http://lucumr.pocoo.org/2006/7/10/why-i-cant-stand-threadlocal-and-others),但大多数都取决于threadlocals是坏的,因为它是不雅.
我有一个场景,其中thellocals将使事情变得更加容易.(我有一个应用程序,人们将有子域名,因此所有模型都需要访问当前子域名,并且从请求中传递它们是不值得的,如果threadlocals的唯一问题是它们不优雅,或者变得脆弱码.)
许多Java框架似乎也经常使用threadlocals,那么他们的情况与Python/Django的情况有何不同?
Car*_*yer 22
我避免使用threadlocals,因为它引入了一个隐式的非局部耦合.我经常以各种非面向HTTP的方式使用模型(本地管理命令,数据导入/导出等).如果我访问models.py中的一些threadlocals数据,现在我必须找到一些方法来确保每当我使用我的模型时它总是被填充,这可能会非常难看.
在我看来,更明确的代码更清晰,更易于维护.如果模型方法需要子域才能运行,那么通过让该方法接受该子域作为参数,该事实应该是显而易见的.
如果我绝对找不到在threadlocals中存储请求数据的方法,我至少会在一个单独的模块中实现包装器方法,该模块访问threadlocals并使用所需的数据调用模型方法.这样,models.py仍然是独立的,模型可以在没有threadlocals耦合的情况下使用.
kib*_*zer 18
我不认为threadlocals有什么问题 - 是的,它是一个全局变量,但除此之外它是一个普通的工具.我们仅仅为此目的使用它(在上下文中将子域模型存储到来自中间件的当前请求)并且它完美地工作.
所以我说,使用正确的工具,在这种情况下,threadlocals使你的应用程序比在所有模型方法中传递子域模型更优雅(没有提到它甚至不总是可能的事实 - 当你重写django管理器通过子域限制查询的方法,例如,你无法将任何额外的东西传递给get_query_set - 所以threadlocals是自然而且唯一的答案.
| 归档时间: | 
 | 
| 查看次数: | 4620 次 | 
| 最近记录: |