django如何实现并发的(django并发)

大神,请讲解下,django如何实现并发的(django并发)
最新回答
鬼怪

2024-10-30 11:06:48

导读:本篇文章首席CTO笔记来给大家介绍有关django如何实现并发的的相关内容,希望对大家有所帮助,一起来看看吧。

python并发编程-进程池

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。多进程是实现并发的手段之一,需要注意的问题是:

例如当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个。。。手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

我们就可以通过维护一个进程池来控制进程数目,比如httpd的进程模式,规定最小进程数和最大进程数..

ps:对于远程过程调用的高级应用程序而言,应该使用进程池,Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,就重用进程池中的进程。

创建进程池的类:如果指定numprocess为3,则进程池会从无到有创建三个进程,然后自始至终使用这三个进程去执行所有任务,不会开启其他进程

参数介绍:

方法介绍:

主要方法:

其他方法(了解部分)

应用:

发现:并发开启多个客户端,服务端同一时间只有3个不同的pid,干掉一个客户端,另外一个客户端才会进来,被3个进程之一处理

回调函数:

需要回调函数的场景:进程池中任何一个任务一旦处理完了,就立即告知主进程:我好了额,你可以处理我的结果了。主进程则调用一个函数去处理该结果,该函数即回调函数

我们可以把耗时间(阻塞)的任务放到进程池中,然后指定回调函数(主进程负责执行),这样主进程在执行回调函数时就省去了I/O的过程,直接拿到的是任务的结果。

如果在主进程中等待进程池中所有任务都执行完毕后,再统一处理结果,则无需回调函数

如何用nginx关联django应用

通过Nginx部署Django(基于ubuntu)

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。

可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。

Linux的强项是用来做服务器,所以,下面的整个部署过程我们选择在Ubuntu下完成。

一、安装Nginx

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

Nginx同样为当前非常流行的web服务器。利用其部署Django,我们在此也做简单的介绍。

Nginx官网:

打开ubuntu控制台(ctrl+alt+t)利用Ubuntu的仓库安装。

fnngj@ubuntu:~$sudoapt-getinstallnginx#安装

启动Nginx:

fnngj@ubuntu:~$/etc/init.d/nginxstart#启动

fnngj@ubuntu:~$/etc/init.d/nginxstop#关闭

fnngj@ubuntu:~$/etc/init.d/nginxrestart#重启

修改Nginx默认端口号,打开/etc/nginx/nginx.conf文件,修改端口号。

复制代码

server{

listen8088;#修改端口号

server_namelocalhost;

#charsetkoi8-r;

#access_loglogs/host.access.logmain;

location/{

roothtml;

indexindex.htmlindex.htm;

}

复制代码

大概在文件36行的位置,将默认的80端口号改成其它端口号,如8088。因为默认的80端口号很容易被其它应用程序占用。

然后,通过上面命令重启nginx。访问:http//127.0.0.1:8088/

如果出现如上图,说明Nginx启动成功。

二、安装uwsgi

通过pip安装uwsgi。

root@ubuntu:/etc#python3-mpipinstalluwsgi

测试uwsgi,创建test.py文件:

defapplication(env,start_response):

start_response('200OK',[('Content-Type','text/html')])

return[b"HelloWorld"]

通过uwsgi运行该文件。

fnngj@ubuntu:~/pydj$uwsgi--http:8001--wsgi-filetest.py

接下来配置Django与uwsgi连接。此处,假定的我的django项目位置为:/home/fnngj/pydj/myweb

fnngj@ubuntu:~/pydj$uwsgi--http:8001--chdir/home/fnngj/pydj/myweb/--wsgi-filemyweb/wsgi.py--master--processes4--threads2--stats127.0.0.1:9191

常用选项:

http:协议类型和端口号

processes:开启的进程数量

workers:开启的进程数量,等同于processes(官网的说法是spawnthespecifiednumberofworkers/processes)

chdir:指定运行目录(chdirtospecifieddirectorybeforeappsloading)

wsgi-file:载入wsgi-file(load.wsgifile)

stats:在指定的地址上,开启状态服务(enablethestatsserveronthespecifiedaddress)

threads:运行线程。由于GIL的存在,我觉得这个真心没啥用。(runeachworkerinprethreadedmodewiththespecifiednumberofthreads)

master:允许主进程存在(enablemasterprocess)

daemonize:使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonizeuWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

pidfile:指定pid文件的位置,记录主进程的pid号。

vacuum:当服务器退出的时候自动清理环境,删除unixsocket文件和pid文件(trytoremoveallofthegeneratedfile/sockets)

三、Nginx+uwsgi+Django

接下来,我们要将三者结合起来。首先罗列一下项目的所需要的文件:

myweb/

├──manage.py

├──myweb/

│├──__init__.py

│├──settings.py

│├──urls.py

│└──wsgi.py

└──myweb_uwsgi.ini

在我们通过Django创建myweb项目时,在子目录myweb下已经帮我们生成的wsgi.py文件。所以,我们只需要再创建myweb_uwsgi.ini配置文件即可,当然,uwsgi支持多种类型的配置文件,如xml,ini等。此处,使用ini类型的配置。

复制代码

#myweb_uwsgi.inifile

[uwsgi]

#Django-relatedsettings

socket=:8000

#thebasedirectory(fullpath)

chdir=/home/fnngj/pydj/myweb

#Djangoswsgifile

module=myweb.wsgi

#process-relatedsettings

#master

master=true

#maximumnumberofworkerprocesses

processes=4

#...withappropriatepermissions-maybeneeded

#chmod-socket=664

#clearenvironmentonexit

vacuum=true

复制代码

这个配置,其实就相当于在上一小节中通过wsgi命令,后面跟一堆参数的方式,给文件化了。

socket指定项目执行的端口号。

chdir指定项目的目录。

modulemyweb.wsgi,可以这么来理解,对于myweb_uwsgi.ini文件来说,与它的平级的有一个myweb目录,这个目录下有一个wsgi.py文件。

其它几个参数,可以参考上一小节中参数的介绍。

接下来,切换到myweb项目目录下,通过uwsgi命令读取myweb_uwsgi.ini文件启动项目。

复制代码

fnngj@ubuntu:~$cd/home/fnngj/pydj/myweb/

fnngj@ubuntu:~/pydj/myweb$uwsgi--inimyweb_uwsgi.ini

[uWSGI]gettingINIconfigurationfrommyweb_uwsgi.ini

***StartinguWSGI2.0.12(32bit)on[SatMar1213:05:062016]***

compiledwithversion:4.8.4on26January201606:14:41

os:Linux-3.19.0-25-generic#26~14.04.1-UbuntuSMPFriJul2421:18:00UTC2015

nodename:ubuntu

machine:i686

clocksource:unix

detectednumberofCPUcores:2

currentworkingdirectory:/home/fnngj/pydj/myweb

detectedbinarypath:/usr/local/bin/uwsgi

!!!nointernalroutingsupport,rebuildwithpcresupport!!!

chdir()to/home/fnngj/pydj/myweb

yourprocessesnumberlimitis15962

yourmemorypagesizeis4096bytes

detectedmaxfiledescriptornumber:1024

lockengine:pthreadrobustmutexes

thunderlock:disabled(youcanenableitwith--thunder-lock)

uwsgisocket0boundtoTCPaddress:8000fd3

Pythonversion:3.4.3(default,Oct142015,20:37:06)[GCC4.8.4]

***Pythonthreadssupportisdisabled.Youcanenableitwith--enable-threads***

Pythonmaininterpreterinitializedat0x8b52dc0

yourserversocketlistenbacklogislimitedto100connections

yourmercyforgracefuloperationsonworkersis60seconds

mapped319920bytes(312KB)for4cores

***OperationalMODE:preforking***

WSGIapp0(mountpoint='')readyin1secondsoninterpreter0x8b52dc0pid:7158(defaultapp)

***uWSGIisrunninginmultipleinterpretermode***

spawneduWSGImasterprocess(pid:7158)

spawneduWSGIworker1(pid:7160,cores:1)

spawneduWSGIworker2(pid:7161,cores:1)

spawneduWSGIworker3(pid:7162,cores:1)

spawneduWSGIworker4(pid:7163,cores:1)

复制代码

注意查看uwsgi的启动信息,如果有错,就要检查配置文件的参数是否设置有误。

再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,添加如下内容。

复制代码

……

server{

listen8099;

server_name127.0.0.1

charsetUTF-8;

access_log/var/log/nginx/myweb_access.log;

error_log/var/log/nginx/myweb_error.log;

client_max_body_size75M;

location/{

includeuwsgi_params;

uwsgi_pass127.0.0.1:8000;

uwsgi_read_timeout2;

}

location/static{

expires30d;

autoindexon;

add_headerCache-Controlprivate;

alias/home/fnngj/pydj/myweb/static/;

}

}

……

复制代码

listen指定的是nginx代理uwsgi对外的端口号。

server_name网上大多资料都是设置的一个网址(例,wwwexamplecom),我这里如果设置成网址无法访问,所以,指定的到了本机默认ip。

在进行配置的时候,我有个问题一直想不通。nginx到底是如何uwsgi产生关联。现在看来大概最主要的就是这两行配置。

includeuwsgi_params;

uwsgi_pass127.0.0.1:8000;

include必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口与myweb_uwsgi.ini配置文件中的必须一直。

现在重新启动nginx,翻看上面重启动nginx的命令。然后,访问:http//127.0.0.1:8099/

通过这个IP和端口号的指向,请求应该是先到nginx的。如果你在页面上执行一些请求,就会看到,这些请求最终会转到uwsgi来处理。

python高并发web框架有哪些

python的web框架很多

django(大而全,模板,orm都自带)

flask(pocoo出品,比属精品,自带jinja2模板,可以替换)

web.py(这个我没用过,作者自杀,白瞎了一个高手)

bottle(只有一个文件的框架,需要自己构建整个开发体系)

uliweb(中国人开发的,也很不错)

Tornado(异步框架,适合长连接,比如在线聊天之类的)

Python框架虽然说是百花齐放,但仍然有那么一家是最大的,它就是Django。Django为人所称道的地方主要有:

①完美的文档,Django的成功,我觉得很大一部分原因要归功于Django近乎完美的官方文档(包括Djangobook)。

②全套的解决方案,Django象Rails一样,提供全套的解决方案(full-stackframework+batteriesincluded),基本要什么有什么(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,开发网站应手的工具Django基本都给你做好了,因此开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。

③强大的URL路由配置,Django让你可以设计出非常优雅的URL,在Django里你基本可以跟丑陋的GET参数说拜拜。

④自助管理后台,admininterface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。

django并发请求是多线程吗

用Django搭了个环境,创建了一个App。

我想要测试假如同时多个请求进来Django的处理方式,于是写了一下代码在View.py中:

Pythoncode?

defarchive(request):

print("start")

time.sleep(5)

print("end")

returnHttpResponse("HellowWorld")

django并发是多线程还是epoll

django自带的那个是效率相当低下的,它没有采用epoll/kqueue。

具体支持多少人在线,这个很难说。

测了一下,对于我的电脑,初始django工程的根的并发能力大概是294。

相比而言,tornado是高性能的server,用它文档的web的范例,并发能力大概是1324。

对nginx上的一个只包含“helloworld!"的静态文件的访问,并发能力大概是2942

结语:以上就是首席CTO笔记为大家整理的关于django如何实现并发的的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~