我想使用内存中线程本地缓存来存储数据库中的值,该值在请求/响应周期期间不会更改,但会被调用数百次(可能数千次)。我有限的理解是,使用“全局”/模块变量是实现此类缓存的一种方法。
e.g.:
#somefile.py
foo = None
def get_foo(request):
global foo
if not foo:
foo = get_foo_from_db(request.blah)
return foo
我想知道在 python 中使用这种类型的“全局”是否是线程安全的,因此我可以放心, get_foo_from_db() 将在 django 中的每个请求/响应周期中被调用一次(使用 runserver 或 Gunicorn+gevent )。我的理解正确吗?这个东西被调用得足够多,即使使用 memcached 来存储值也将成为瓶颈(我正在对它进行分析)。
不,对全局变量的访问不是线程安全的。线程不会获得自己的全局变量副本,全局变量在线程之间共享。
代码:
if not foo:
foo = get_foo_from_db(request.blah)
编译成几个Python字节码语句:
2 0 LOAD_FAST 1 (foo)
3 POP_JUMP_IF_TRUE 24
3 6 LOAD_GLOBAL 0 (get_foo_from_db)
9 LOAD_FAST 0 (request)
12 LOAD_ATTR 1 (blah)
15 CALL_FUNCTION 1
18 STORE_FAST 1 (foo)
21 JUMP_FORWARD 0 (to 24)
每次执行字节码后都可能发生线程切换,因此另一个线程可能会改变foo
在你测试之后.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)