Django - 两个用户访问相同的数据

问题描述:

比方说,我有一个Django Web应用程序与两个用户。我的Web应用程序具有服务器上存在的全局变量(根据来自外部SQL数据库的数据创建的Pandas Dataframe)。Django - 两个用户访问相同的数据

假设一个用户进行update请求到Dataframe而现在Dataframe正在更新。当Dataframe正在更新时,另一个用户对该数据帧发出get请求。有没有办法“锁定”Dataframe,直到用户1完成并完成用户2的请求为止?

编辑:

所以事件的顺序应该是:

用户1作出了更新请求,数据帧被锁定,用户2发出GET请求,数据帧完成更新,数据帧被解锁,用户2得到他/她的要求。

代码行将不胜感激!

+0

“我的web应用程序有一个全局变量...” - 停在那里。编号 –

+0

全局变量并不总是邪恶的,但你必须意识到它们是如何在多线程应用程序的环境中工作的,你不控制线程 –

+0

@MadWombat 我明白,我应该如何处理这个问题?如果两个用户都试图从外部数据库收集相同的数据,那么将其缓存正确有意义? –

Ehm ... Django不是服务器。它有一个单线程开发服务器,但它不应该用于开发之外的任何事情,甚至可能不是这样。 Django应用程序使用WSGI进行部署。运行应用程序的WSGI服务器很可能会启动多个单独的工作线程,并将根据其配置中的规则查杀并重新启动这些线程。

这意味着,你不能依靠多个请求击中相同的过程。 Django应用程序生命周期介于获取请求和返回响应之间。任何在这两个事件之间没有明确执行的事情都应该被视为没有了。

因此,当您的某个用户更新全局变量时,此变量只存在于此用户随机访问的一个进程中。第二个用户可能会也可能不会碰到同一个进程,因此可能会或可能不会获得相同的变量副本。更重要的是,这个过程迟早会被WSGI服务器杀死,并且所有更新都将消失。

我所得到的是你可能想在重新思考你的架构之前,你麻烦原子更新问题。

+0

对不起,这是漫长的一天。我正在通过WSGI部署我的应用程序。 如果两个用户尝试从外部数据库访问相同的数据,那么将其正确地捕获是否合理? –

+0

你能和你想要将数据更新写回到SQL数据库中吗? –

+0

我可以和我想写回数据。 –

如果你要改变它们,不要共享内存对象。并发性很难做到正确,过早优化是邪恶的。为每个用户提供他们自己的数据视图,并仅通过数据库共享数据(使用事务来使您的更新原子化)。每次更新数据库时都会保留和增加数据库中的计数器,如果这些数据在读取数据后发生了更改(如其他人已将其更改),则会导致事务失败。

另外,当疲倦的时候不要做出重要的架构决定! :)

+0

谢谢,我想我会采取这种做法! –