当前位置: 首页 > 网络应用技术

如何改善Django并发(2023年最新完成)

时间:2023-03-06 14:44:40 网络应用技术

  简介:今天,首席执行官指出,要与您分享如何改善Django并发的相关内容。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!

  Python的编程语言仍然很受欢迎。它在最新的TIOBE编程语言排名中排名第五,并且受欢迎程度不断增加。尤其是在AI和大数据时代,Python是AI和大数据时代的第一个开发语言。这是无可争议的事实。唯一的悬念是谁可以参加第二个挑战。Python是一种胶水,广泛使用了。在Web应用程序的领域,众所周知的国内互连公司:Douban Scores(被称为年轻人)是主要重点在高端问答知识社区 - Zhi.

  当涉及到Web应用程序领域,除了Python的语法外,Django是Python.today背景中最重要的框架。

  方法/步骤

  问题1:什么是软件框架?对于一个简单的例子,对于公司而言,公司中有各个职能部门,每个部门都执行其职责。公司的组织结构。从某种意义上说,该公司是一个框架。框架由每个模块组成。每个模块负责特定功能。模块和模块相互合作以完成软件开发。一家为某个市场建立的公司,并且软件框架的设计也是为某种类型的软件问题而设计的。目的是提高软件开发效率。

  问题2:Django的介绍和设计思想?Django是一个用Python语言编写的开源网络开发框架,并遵循MVC设计。在开发基于新闻的网站上,Lawrence Publishing Group开发了此框架,并于2005年7月在BSD许可下发布了IT。Django的主要目的是简单地开发数据库驱动的网站。它强调代码重复使用,并且多个组件可以轻松地以“插件-in”的形式为整个框架提供服务。Django有许多功能强大的第三方插头。您甚至可以轻松地开发自己的工具包。这使Django具有强大的可扩展性。它还强调了快速的开发原则。

  问题3:MVC简介MVC的简介是模型视图控制器。早在1980年代,程序语言SmallTalk发明的软件设计模式就是使用传统的输入,处理和输出。(输出)该任务是在图形用户交互模型中设计的。一个设计概念。它是为了实现分层设计的目的,以便将代码解耦并促进代码的重复使用。MVC是3个单词的缩写,全名:模型 - 视图-Controller(model-vieg-view-controller)).mvc是一项规则,它允许您将相同类型的代码放在一起,以形成一层以实现分层,重用,易于测试和维护的目的。

  当前的主流开发语言(例如Java,PHP和Python)具有MVC框架。Web MVC的每个部分的功能都是模型,它主要封装对数据库层的访问,以及数据库中的数据添加,删除,删除,删除,修改并检查操作。V已满视图,该视图用于包装结果,以生成页面上显示的HTML内容。模型与MVC中的M函数相同。它负责与数据库进行交互以处理数据处理。V已充满视图,与MVC中的C函数相同。接收请求,执行业务处理并返回答案。T是模板,与MVC中的V函数相同。它负责将HTML返回到软件包结构。

  该过程是计算机中最小的资源分配单位。一个过程中可以有多个线程,并且在同一过程中的线程共享资源;

  过程和过程彼此隔离。

  Python可以通过多进程使用多进程的多核优势,并且密集操作适用于多过程。

  关于在基于Python的多探索模块中操作的过程:

  叉,[复制“几乎所有资源” [支持文件对象/线程锁和其他传记] [UNIX] [在任何位置开始] [快速]

  Spawn,[运行参数被动资源] [不支持文件对象/线程锁和其他传记] [UNIX,WIN] [主代码块启动] [慢速]

  forkserver,[运行参数传输基本资源] [不支持文件对象/线程锁和其他传记] [UNIX的一部分] [主代码块启动]

  官方文件:

  示例1

  示例2

  案件:

  过程的常见方法:

  该过程是资源分配的最小单元。在每个过程中,它都维护其独立数据,并且不共享。

  如果您想分享它们,则可以使用一些特殊的事情来实现。

  共享内存

  数据可以存储在共享内存映射用户或数组中。对于Exmple,以下代码[数据可以存储在带有值或数组的共享内存映射中。例如,以下代码]

  服务器过程

  Manager Object by Manager()控制服务器Procestss Python对象和所有Processssssssssssssssssesssesssesssesssesssesssesssesssesssesssesssesssesssesssesssestsestsestsestsest

  [Manager()返回的Manager对象控制服务器进程,该进程保存了Python对象,并允许其他进程使用代理来操作这些对象。

  多处理支持过程之间的两种类型的通信渠道

  [支持两个过程之间的通信渠道]

  队列

  队列类是queue.queue的近乎克隆。对于Exmple

  管道

  管道()函数返回一对由管道白色连接的连接对象是双面的。对于Exmple:

  该函数返回通过管道连接的一对连接的对象,该对象默认为dual -time(两个-way)。例如:

  以上是Python提供的过程之间的数据共享和交换的机制。它可以用作理解。它很少用于项目开发。在后来的项目中,第三方通常使用它来共享资源。例如:MySQL,Redis,Rediswait。

  如果使用多个进程进行某些操作,以防止操作,则可以通过过程锁定避免使用。

  显然,操作时多个过程将遇到问题。目前,您需要锁定:

  注意:如果要在过程池中使用过程锁定,则必须根据管理器中的锁定和RLOCK来实现。

  暂时的理解。

  计算机提供:线程和过程用于实现并发编程(真实存在)。

  Coroutine是程序员通过代码的事情(非现实存在)。

  理事会也可以称为MICR -THEAD,这是用户状态中的上下文切换技术。

  简而言之,实际上,它是实现编码块通过线程(来回跳跃)相互切换。

  例如:

  以上代码是正常的函数定义和执行。这两个函数中的代码是根据过程执行的,输出将输出:1、2、3和4。

  但是,如果可以实现介入的Coroutine技术,则该功能可以看到代码切换执行,最终输入:1、3、2和4。

  有很多方法可以在Python中实施公司,例如:

  尽管以上两个都已实现,但这种编写代码的方式毫无意义。

  此背部 - 和 - 孔执行可能会使程序的执行速度较慢(与串行相比)。

  Coroutine如何更有意义?

  通过上述内容发现,在处理IO请求时,Coroutine可以通过线程实现并发操作。

  现在,许多Python框架都在支持企业,例如:Fastapi,Tornado,Sanic,Django 3,AioHTTP等,并且已经开发了越来越多的企业(目前不是很多)。

  由于建立连接的成本非常高,因此每次我们访问数据库时,它都非常消耗。

  当我们启动程序时,我们可以首先创建一些连接,将其放入集合中,在访问数据库时从集合中获取它,然后将其放回集合中。

  这只是在程序启动时消耗性能以创建连接。每次访问数据库时,都可以从内存中获得连接,从而可以大大提高效率。

  防范措施:

  因为池中的添加和删除非常频繁,所以LinkedList的使用很高

  集合中的所有连接都在被占用时创建它们,但是您需要注意连接总数

  使用组合模式/动态代理来处理释放连接的释放。运行关闭方法时,将连接放回池

  关于数据库连接池:

  数据库连接是一种关键且有限的昂贵资源,在多用户Web应用程序中尤其突出。数据库连接的管理可以显着影响整个应用程序的望远镜和鲁棒性,并影响程序的性能指标。数据库连接池为此问题提出了提出。

  数据库连接池负责分配,管理和发布数据库连接。它允许应用程序重复使用现有数据库连接的使用,并且不再重新建立一个;由遗漏引起的数据库。这项技术可以显着提高数据库操作的性能。

  当数据库连接池初始化时,数据库连接池是连接到连接池的,并且这些数据库连接的数量由最小数据库连接编号设置。无需履行这些数据库连接,连接池始终保证至少保证连接数。连接池的最大数据库连接限制了连接池可以拥有的最大连接数。当应用程序到连接池要求的连接数超过最大连接数时,这些请求将添加到等待队列。

  最小连接数和数据库连接池的最大连接数应考虑以下因素:

  1)最小连接数是维护连接池的数据库连接,因此,如果数据库连接的应用不大,则会浪费大量数据库连接资源;

  2)最大连接数是连接池可以应用的最大连接数。如果数据库连接请求超过此数字,则将添加后续数据库连接请求,将影响等待队列,这将影响后续数据库操作。

  3)如果最小连接数与最大连接数量太大,则第一个连接请求将获利,然后超过最小连接数量的连接请求等于建立新的数据库连接。这些数据库大于最低连接将不会在使用后立即发布。它将被放置在连接池中等待重复使用或在闲暇后释放。

  当J2EE服务器启动时,将建立一定数量的池连接,并且维护少于该数字的池连接已被维护。

  呼叫:当需要连接客户端程序时,池驱动程序将返回未使用的池连接并将其记录为忙碌。如果目前没有空闲连接,则池驱动程序将创建一定数量的新连接,并且新连接的数量由配置参数确定。

  发布:使用池连接的使用完成后,池驱动程序记录此连接表作为空闲,其他调用可用于使用此连接

  通过nginx部署Django(基于Ubuntu)

  部署Django有很多方法。NGINX+UWSGI的方法是一种更常见的方法。

  这样,我们通常的方法是将NGINX用作服务器的前端,它将接收Web的所有请求并均匀地管理请求。NGINX请求所有静态请求以处理自身(这是NGINX的优势)。

  可以看出,UWSGI的作用类似于桥梁。它扮演了桥梁的角色。

  Linux的强度用于用作服务器,因此我们选择完成以下整个部署过程。

  1.安装nginx

  NGINX是一款轻巧的Web服务器/反向代理服务器和电子邮件(IMAP/POP3)代理服务器,并根据BSD样协议发行。它的特征是拥有较少的内存和强大的并发症。实际上,NGINX的并发能力确实在同一类型的Web服务器中表现良好。

  Nginx也是一家非常受欢迎的Web服务器。在其部署Django的情况下,我们还在这里简要介绍。

  NGINX官方网站:

  打开Ubuntu控制台(CTRL+ALT+T),以使用Ubuntu的仓库安装。

  fnngj@ubuntu:?$ sudo apt-get安装nginx #installation

  启动nginx:

  fnngj@ubuntu:?$ /etc/init.d/nginx开始#startup

  fnngj@ubuntu:?$ /etc/init.d/nginx stop #close

  fnngj@ubuntu:?$ /etc/init.d/nginx restart #restart

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

  复制代码

  服务器 {

  听8088;#修改端口号

  server_name localhost;

  #Charset KOI8-R;

  #access_log logs/host.access.log main;

  地点 / {

  根HTML;

  索引index.html index.htm;

  }

  复制代码

  关于文件36的位置,默认的80端号更改为其他端口号,例如8088。由于其他应用程序很容易占用默认的80 -port号码。

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

  如果图片出现在上方,则NGINX启动成功。

  第二,安装UWSGI

  通过PIP安装UWSGI。

  root@ubuntu:/etc#python3 -m pip安装uwsgi

  测试UWSGI并创建一个test.py文件:

  def应用程序(env,start_response):

  start_response('200 ok',[('content-type','text/html')]))))))

  返回[B“ Hello World”]]

  通过UWSGI运行文件。

  fnngj@ubuntu:?/pydj $ uwsgi-http:8001-wsgi-file test.py

  下一个配置Django连接到UWSGI。

  fnngj@ubuntu:?/pydj $ uwsgi-http:8001-chdir/home/fnngj/pydj/myweb/-wsgi-file myweb/wsgi.py-master-master-master-master-master-processers 4-threads 2-stats127.0.0.0.0.0.0.0.0.1:9191919191:919191:919191

  共同选择:

  HTTP:协议类型和端口号

  过程:启动过程的数量

  工人:启动过程的数量等同于流程

  CHDIR:指定操作目录

  WSGI文件:已加载的WSGI文件(load.wsgi文件)

  统计:在指定的地址上,开始状态服务

  线程:运行threads.due to gil的存在,我认为这确实没有用。

  主:允许主进程(启用主过程)

  DAEMONIZE:使该过程在后台运行,并将日志击中指定的日志文件或UDP服务器(DAEMONIZE UWSGI)。实际上,最常用的是在本地文件上输出操作记录。

  PIDFILE:指定PID文件的位置并记录主过程的PID号。

  真空:当服务器退出时,自动清理环境,删除UNIX套接字文件和PID文件(尝试删除所有生成的文件/插座)

  3. nginx+uwsgi+django

  接下来,我们必须结合三个。第一个列表项目的必需文件:

  myweb/

  e- manage.py

  b - ├myweb/

  │_ _- __init__.py

  │e ─—设置.py

  │u - urURLS.PY

  │s-wsgi.py

  b - ─myweb_uwsgi.ini

  当我们通过django创建MyWeb项目时,由sub -directory myweb生成的wsgi.py文件。因此,我们只需要创建myweb_uwsgi.ini配置文件即可。当然,UWSGI支持多种类型的配置文件,例如XML,INI等。

  复制代码

  #myweb_uwsgi.ini文件

  [UWSGI]

  #与Django相关的设置

  插座=:8000

  #基本目录(完整路径)

  chdir =/home/fnngj/pydj/myweb

  #django s wsgi文件

  模块= myweb.wsgi

  #与过程相关的设置

  # 掌握

  主= true

  #最大工程数量

  过程= 4

  #...有适当的权限 - 可能需要

  #chmod-socket = 664

  #出口清除环境

  真空= true

  复制代码

  这种配置实际上等同于上一节中的WSGI命令,以及用一堆参数归档的方法。

  套接字指定项目执行的端口号。

  CHDIR指定项目目录。

  模块myweb.wsgi,您可以这样理解。对于myweb_uwsgi.ini文件,有一个具有级别的myWeb目录。此目录中有一个wsgi.py文件。

  几个参数可以参考上一节中的参数引入。

  接下来,切换到MyWeb项目目录,然后读取myweb_uwsgi.ini文件以通过UWSGI命令启动项目。

  复制代码

  fnngj@ubuntu:?cd/home/fnngj/pydj/myweb/

  fnngj@ubuntu:?/pydj/myweb $ uwsgi -ini myweb_uwsgi.ini

  [uwsgi]从myweb_uwsgi.ini获取INI配置

  ***开始UWSGI 2.0.12(32bit)[星期六3月12日13:05:06 2016] ***

  编译版本:4.8.4,2016年1月26日06:14:41

  操作系统:Linux-3.19.0-25代#26?14.04.1-ubuntu SMP星期五24:18:00 UTC 2015

  Nodename:Ubuntu

  机器:I686

  时钟来源:UNIX

  检测到的CPU核心数:2

  当前的工作目录:/home/fnngj/pydj/myweb

  检测到的二进制路径:/usr/local/bin/uwsgi

  !!!没有Interzal路由支持,可以通过PCRE支持重建!!!

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

  您的过程编号限制为15962

  您的内存页面大小为4096字节

  检测到的最大文件描述符编号:1024

  锁发动机:Pthread robust Mutexes

  雷霆锁:禁用(您可以使用锁定锁)启用它)

  UWSGI插座0绑定到TCP地址:8000 FD 3

  Python版本:3.4.3(默认,2015年10月14日,20:37:06)[GCC 4.8.4]

  *** Python线程支持被禁用。您可以使用-nable-threads ***启用它

  Python主解释器在0x8B52DC0初始化

  您的服务器插座收听积压限制为100个连接

  您对工人的优雅运营的怜悯是60秒

  映射4核的319920字节(312 kb)

  ***操作模式:预叉***

  WSGI应用程序0(MountPoint ='')在解释器0x8b52dc0 pid:7158(默认应用程序)上准备就绪。

  *** UWSGI以多解释器模式运行***

  产卵的UWSGI主处理(PID:7158)

  产卵的UWSGI工人1(PID:7160,核心:1)

  产卵的UWSGI工人2(PID:7161,核心:1)

  产卵的UWSGI工人3(PID:7162,核心:1)

  产卵的UWSGI工人4(PID:7163,核心:1)

  复制代码

  注意UWSGI的启动信息。如果有任何错误,请检查是否设置了配置文件的参数。

  我需要做的下一步是修改nginx.conf配置文件。open/etc/nginx/nginx.conf文件并添加以下内容。

  复制代码

  本国的

  服务器 {

  听8099;

  server_name 127.0.0.1

  charset UTF-8;

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

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

  client_max_body_size 75m;

  地点 / {

  包括uwsgi_params;

  UWSGI_PASS 127.0.0.1:8000;

  uwsgi_read_timeout 2;

  }

  位置 /静态{

  到期30d;

  自动索引;

  add_header缓存控制prive;

  别名/home/fnngj/pydj/myweb/static/;

  }

  }

  本国的

  复制代码

  侦听指定NGINX代理UWSGI的外部端口号。

  server_name Internet上的大多数信息是URL集(例如,wwwexamplecom)。如果我将其设置在此处,则无法访问它,因此指定了指定的默认IP。

  配置后,我有一个问题,我一直在考虑它。nginx如何与UWSGI关联。现在看来,最重要的是这两行配置。

  包括uwsgi_params;

  UWSGI_PASS 127.0.0.1:8000;

  必须指定包含为uwsgi_params;以及uwsgi_pass和myweb_uwsgi.ini配置文件的IP端口。

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

  通过此IP和端口号的方向,请求首先为nginx。如果您在页面上执行一些请求,则将看到这些请求最终将转移到UWSGI以处理它。

  结论:以上是首席CTO的相关内容注明了如何改善Django并发的相关内容。希望它对您有所帮助!如果您解决了问题,请与更多关心此问题的朋友分享?