用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现象相同。