我在使用Django的App Engine上运行python应用程序。另外,我正在使用名为gae-sessions
的会话管理库。如果threadsafe
设置为"no"
,则没有问题,但当threadsafe
设置为"yes"
时,我偶尔会看到会话丢失的问题。App Engine/Django - 交错多个请求干扰GAE会话
我看到的问题是,启用了treading时,多个请求在GAE-Sessions中间件中偶尔交错。
在gae-sessions
库中,有一个名为_tls
的变量,它是一个threading.local()
变量。当用户向网站发出http请求时,首先运行一个名为process_request()
的函数,随后为当前页面生成一堆自定义html代码,然后运行一个名为process_response()
的函数。状态记在process_request
和process_response
之间_tls
“线程安全”变量中。我可以通过打印_tls
值(例如"<thread._local object at 0xfc2e8de0>"
)来检查_tls
变量的唯一性。
我偶尔目睹的是GAE-Sessions中间件中似乎只有一个线程(由于它们具有与thread_local对象相同的内存位置并且由来自一个请求的数据似乎是覆盖来自另一个请求的数据这一事实),多个http请求正在被交织。鉴于用户1和用户,使在同一时间的请求,我亲眼目睹了以下执行顺序:
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
鉴于上述情况,用户2会话重踏一些内部变量,并导致用户1的会话丢失。
所以,我的问题如下: 1)在App-Engine/Django/Python中,中间件期望行为中的不同请求交错了吗? (或者我完全困惑,而且还有其他事情正在发生) 2)这种交错发生在什么级别(App-Engine/Django/Python)?
看到这种行为让我感到非常惊讶,因此有兴趣了解这里发生了什么/发生了什么。
我认为以下是相关的:http://stackoverflow.com/questions/6214509/is-django-middleware-thread-safe - 因此,似乎Django中间件不是线程安全的,这可以解释以上行为。 –
这也是相关的:http://blog.roseman.org.uk/2010/02/01/middleware-post-processing-django-gotcha/ –
这是发生在dev_appserver还是在生产?如果它在生产中,那么这两个请求有可能在不同的实例上运行。 – dragonx