关于django并发访问

用django起了个小server,请求并行过来的时候发现前一个请求全局变量被后一个请求篡改了,惊讶的发现django处理并发请求时用的居然是多线程,而不是我以为的多进程。因此在用django实现服务器的时候,一定要注意全局变量的使用。

在网上搜这个问题的时候,发现有人说django同接口处理任务是串行,不同接口处理任务是多线程,也实验了下,发现其实相同接口其实也是多线程并行的,不知道是不是版本不同。


实验一

先访问test1接口,test1对应函数中有sleep,不会马上返回。再访问test2接口。发现10s后,test1接口返回数值为2。可验证全局变量a被test2修改


实验二

用浏览器访问两遍test1接口,这个时候chrom出了一个很神奇的现象,用一个便签页刷新两遍,日志打出start start end end,为并行处理。开两个标签页同时刷新日志打出为start end start end,为串行处理。研究了半天两个便签页同时刷和一个标签页刷新两遍的区别,后来发现换个浏览器就没有串行情况了,感觉是chrom本身有什么机制,没有具体研究。但是验证django处理同接口请求应该也是并行的。


实验三

定义了个全局变量,每次+1,验证会不会每次都被初始化。答案:并不会。每次访问都是在上一次基础上+1,因为是多线程的,如果有功能上需要对变量进行这个操作,需要加锁。而且这个变量应该是服务器有问题重启就会被初始化,感觉极其不安全,应该没有人会这么用吧。a和a1现象相同。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。