django是单线程还是多线程,Django多线程
目录django多线程#1环境#2 Django原生单线程#3 Django服务器默认多线程#3.1测试#4用uWSGI服务器启动django#4.1启动uWSGI#4.2向uWSGI添加进程#5总结Django # 4.1的多线程问题
Django多线程#1环境Python 3 . 7 . 3 Django==2 . 0 . 7 uws gi==2 . 0 . 18 # 2 Django原生单线程#1
Django是一个原生的单行程序。当第一个请求没有完成时,第二个请求将被阻塞。在第一个请求完成之前,不会执行第二个请求。
#2 Django不使用异步,而是通过线程实现并发,这也是WSGI的普遍做法,和tornado不是一个概念。
#3 django服务器默认多线程官方文档解释django自己的服务器默认是多线程的。
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-nmynqj 4-1591867681155)(3359 raw . githubusercontent . com/coxhuang/yosoro/master/20190507225848-image . png)]
#3.1测试python 3 manage . py RunServer 0 . 0 . 0:8000 Django有两个接口,第一个接口是sleep(20),另一个接口没有延迟(需要几毫秒)
先请求第一个接口,再请求第二个接口,第二个接口返回数据,20秒后第一个接口返回数据。
证明django的服务器是默认多线程的
3 python manager . py runserver 0 . 0 . 0:8000-无线程重复上述步骤。
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-umj 9 iyfh-1591867681157)(3359 raw . githubusercontent . com/coxhuang/yo Soro/master/20190507230747-image . png)]
#4用uWSGI服务器启动django # 4.1在django项目目录下启动uWSGI #,演示项目名称uWSGI-http 0 . 0 . 0:8000-file Demo/wsgi . py经过以上步骤,发现在这种情况下启动Django项目时,uw SGI也是单线程,访问接口需要排队。
没有进程被添加到uWSGI。uWSGI默认为单进程单线程。
#4.2将进程数添加到uw SGI uw SGI-http 0 . 0 . 0:8000-file demo/wsgi . py-processes 4-Threads 2 #进程:进程数与workers # threads:每个进程打开的线程数已经过测试,可以‘同时’访问接口
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-DPNUMPNA-1591867681159)(3359 raw . githubusercontent . com/coxhuang/yosoro/master/20190507233529-image . png)]
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-LBJZBUV-1591867681160)(3359 raw . githubusercontent . com/coxhuang/yosoro/master/20190507233629-image . png)]
#5总结一下关于django python的多线程问题。由于GIL的存在,一个进程只允许一个线程工作,这就使得单进程多线程无法发挥多核多进程的优势。线程之间没有GIL抢占,每个进程都有自己的线程锁。多进程多GIL单进程多线程Python应用可以实现并发。但是,在没有并行多进程的多处理器python应用程序中,可能存在并行性。至于并发还是并行,由操作系统决定。如果分配单个处理器处理多个进程,那么它是并行的,如果分配给多个处理器,那么它是并行的。Nginx uWSGI可以在python中实现高并发。