我们说我有一个有两个用户的Django
网络应用程序。我的Web应用程序有一个全局变量存在于服务器上(从Pandas Dataframe
数据库的数据创建的SQL
)。
我们假设用户向update
发出了Dataframe
个请求,现在正在更新Dataframe
。在更新Dataframe
时,其他用户会对该Dataframe发出get
请求。有没有办法锁定' Dataframe
直到用户1完成它然后完成用户2发出的请求?
编辑:
所以事件的顺序应该是:
用户1发出更新请求,Dataframe被锁定,用户2发出获取请求,Dataframe完成更新,Dataframe解锁,用户2获取他/她的请求。
代码行将不胜感激!
答案 0 :(得分:2)
Ehm ...... Django不是服务器。它有一个单线程开发服务器,但它不应该用于开发之外的任何东西,甚至可能不会用于此。使用WSGI部署Django应用程序。运行应用程序的WSGI服务器可能会启动几个单独的工作线程,并根据其配置中的规则杀死并重新启动这些线程。
这意味着,您不能依赖于同一进程的多个请求。 Django应用程序生命周期是在获取请求和返回响应之间。任何在这两个事件之间没有明确表示持久性的事情都应该被认为已经消失。
因此,当您的某个用户更新全局变量时,此变量仅存在于此用户随机访问的一个进程中。第二个用户可能会或可能不会访问相同的进程,因此可能会或可能不会获得该变量的相同副本。更重要的是,这个过程迟早会被WSGI服务器杀死,所有更新都将消失。
我所得到的是,在您厌烦原子更新问题之前,您可能需要重新考虑您的架构。
答案 1 :(得分:1)
如果要改变它们,请不要共享内存对象。并发是很难做到的,过早的优化是邪恶的。为每个用户提供他们自己的数据视图,并且只通过数据库共享数据(使用事务使您的更新成为原子)。每次进行更新时,都要在数据库中保留并增加计数器,如果读取数据后这些数字发生了变化,则会导致事务失败(正如其他人已经对其进行了变异)。
另外,累了时不要做出重要的建筑决定! :)