我正在使用 Django 在 App Engine 上运行 python 应用程序。此外,我正在使用一个名为gae-sessions
. 如果threadsafe
设置为"no"
,则没有问题,但是当threadsafe
设置为时"yes"
,我偶尔会看到会话丢失的问题。
我看到的问题是,当启用踩踏时,多个请求偶尔会在 GAE-Sessions 中间件中交错。
在gae-sessions
库中,有一个名为 的变量_tls
,它是一个threading.local()
变量。当用户向网站发出http请求时,process_request()
首先运行一个被调用的函数,然后为当前页面生成一堆自定义的html,然后process_response()
运行一个被调用的函数。状态被记住在“线程安全”变量中process_request
和之间。我可以通过打印出值(例如)来检查变量的唯一性。 process_response
_tls
_tls
_tls
"<thread._local object at 0xfc2e8de0>"
我偶尔目睹的是,在 GAE-Sessions 中间件中似乎是一个线程(推断为单个线程,因为它们对于 thread_local 对象具有相同的内存位置,并通过数据一个请求似乎覆盖了另一个请求的数据),多个 http 请求正在交错。给定同时发出请求的 User1 和 User2,我见证了以下执行顺序:
User1 -> `process_request` is executed on thread A
User2 -> `process_request` is executed on thread A
User2 -> `process_response` is executed on thread A
User1 -> `process_response` is executed on thread A
鉴于上述情况,User2 会话踩踏了一些内部变量并导致 User1 的会话丢失。
所以,我的问题如下: 1)在 App-Engine/Django/Python 的中间件预期行为中,不同请求是否交错?(或者我完全糊涂了,这里还有其他事情发生)2)这种交错发生在什么级别(App-Engine/Django/Python)?
看到这种行为我感到非常惊讶,因此有兴趣了解这里发生的原因/情况。