关于django这个python服务器的并发能力?

文章目录

  • 1.并发方案
    • 1.1.django
    • 1.2.django + nginx
    • 1.3.uwsgi + nginx
    • 1.4.gunicorn + nginx
    • 1.5.gunicorn + nginx + gevent
  • 2.提高并发能力技巧
  • 3.总结

1.并发方案

1.1.django

毫无疑问,用原生django的server做处理的表现是最烂的,在10000次请求的情况下brokenpipe的几率极高,只有1400次请求被处理,成功率只有14%。

1.2.django + nginx

这次搭上了nginx做反向代理,也使的脆弱的django服务器的情况有所缓解,但成功率仍然不高(10000次请求中有3684个请求被处理)。

1.3.uwsgi + nginx

uwsgi是一个性能极高的C语言编写的服务器,使用uwsgi协议。这次我们将它与nginx结合来处理django的请求,设置为4个进程和2个线程,性能立刻显著提升,请求处理的成功率基本在90%左右。不过在测试时我遇到了一个问题,就是uwsgi在处理请求时出现了队列溢出。因为当前测试设置的并发数为每秒1000次,而uwsgi的处理队列默认容量为100,导致请求处理时间延长。这个问题可以通过修改somaxcon的大小来解决。总的来说,使用uwsgi和nginx是一个理想的选择。

1.4.gunicorn + nginx

gunicorn跟uwsgi类似,也是一个高性能的http服务器,它由ruby的unicorn项目移植,是由python编写的,它的配置简单,而且可以灵活地搭配其他网络库,部署十分方便,在测试数据中可以看到,用这种配置运行django能在短时间内就能处理大量的并发请求,成功率在90%左右。

1.5.gunicorn + nginx + gevent

前面说的几种环境,看似不错,但我们需要追求完美!由于gunicorn是同步(sync)单线程模型的,有的时候它不免会发生一些阻塞问题,这时候我们为gunicorn加上-k gevent参数来用gevent做处理接口,这就比较靠谱地处理了阻塞问题,从数据中可以看到,gunicorn + nginx + gevent的模式不仅拥有100%的处理成功率,而且时间也在很短之内完成,是5组测试数据当中的性能最好的。

2.提高并发能力技巧

Django 是一个用 Python 编写的高级 Web 框架,它允许开发者快速开发安全和维护性高的网站。虽然 Django 本身设计为单线程处理每个请求,即默认情况下每个请求在一个进程中顺序处理,但通过适当的配置和架构设计,它可以支持高并发环境。

以下是提高 Django 应用并发处理能力的一些常见策略:

  1. 使用高性能的 Web 服务器

    • 使用如 Nginx 或 Apache 这样的反向代理服务器来处理静态文件,并可以负载均衡到多个 Django 实例上。
    • 使用 uWSGI 或 Gunicorn 这样的 WSGI 服务器来处理 Django 应用。它们可以配置为使用多进程或多线程模式来处理请求。
  2. 优化数据库性能

    • 使用高性能的数据库如 PostgreSQL 或 MySQL,而不是默认的 SQLite。
    • 对数据库查询进行优化,包括使用缓存、创建索引、减少不必要的查询等。
  3. 缓存机制

    • 利用缓存来减少数据库负担,例如使用 Memcached 或 Redis 进行页面或片段缓存。
    • 对数据库查询结果进行缓存,减少数据库访问频率。
  4. 异步处理

    • 使用 Celery 这样的任务队列来处理耗时的任务,这可以让主应用快速响应用户请求。
    • 利用 Django Channels 来处理 WebSocket 请求,使得 Django 可以处理异步通信。
  5. 负载均衡

    • 在多个服务器之间分散请求,可以水平扩展应用程序,提高可用性和性能。
  6. 代码优化

    • 优化代码逻辑,减少不必要的计算和资源消耗。
    • 尽可能避免在视图函数中进行复杂的业务逻辑处理,将复杂操作移到单独的服务层或管理命令中。
  7. 使用异步框架

    • 考虑使用 Django 的异步支持,从 Django 3.0 开始,官方引入了对异步视图的支持,这允许使用 async/await 语法编写非阻塞性的代码。

需要注意的是,虽然有多种方法可以提高 Django 的并发处理能力,但实际效果依赖于很多因素,包括但不限于硬件性能、网络状况、应用架构等。因此,在部署高并发应用时,通常需要综合运用上述策略,并根据实际应用场景进行调整。

3.总结

从实战经验来看,推荐大家在linux上使用gunicorn + nginx体系来部署,如果存在耗时任务,推荐使用celery来缓解服务器响应压力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452953.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity精品插件】Magica Cloth:Unity布料模拟的新高度

📂 Unity 开发资源汇总 | 插件 | 模型 | 源码 💓 欢迎访问 Unity 打怪升级大本营 在Unity游戏开发中,物理模拟是使角色和场景更加生动和真实的重要工具之一。Magica Cloth 是一个专为物理效果设计的插件,它提供了轻量级、高性能的…

当LangGraph遇上Mem0:如何让你的AI Agent具有更智能的记忆与个性化的体验?

AI Agent(智能体)的记忆(Memory)被认为是一项必备的基础能力,它用来提取、存储会话中的重要信息并用于后续的检索与使用。可以把记忆简单地分成短期记忆与长期记忆两种,用来“记住”不同类型的信息&#xf…

华为CE交换机telnet登录失败故障的排查方法

检查网络状态 操作步骤 1、执行命令ping xxx.xxx.xxx.xxx(目的IP网段) 根据报文是否丢包确认是否可以访问该设备,网络不通请检查组网及网络地址、静态路由等相关配置。 检查VTY通道是否已占满? 操作步骤 1、在任意视图下,执行命令displ…

【MySQL】清理二进制日志文件 binlog.000XXX 以解决 Ubuntu 系统磁盘空间耗尽的问题

问题描述 在使用Ubuntu系统时,发现磁盘空间异常地被填满。通过使用ncdu工具进行检查,结果显示/var/lib/mysql文件夹占用了高达63GB的存储空间。 进一步查看该目录,发现存在几百个以binlog为前缀的文件。 原因分析 这些以binlog为前缀的文件…

2020年计算机网络408真题解析

第一题: 解析:OSI参考模型网络协议的三要素 网络协议的三要素:语法 ,语义,同步(时序) 语法:定义收发双方所交换信息的格式 语法:定义收发双方所要完成的操作 网页的加载 …

汽车电子笔记之-014:一场FIFO的思考引发将汽车电子DTC相关 - 故障发生前后关键数据记录并回读的功能浅研发

目录 1、概述 2、故障发生前数据记录 2.1、环形数组C语言实现 2.2、FIFO的C语言实现 3、故障发生后数据记录 4、数据存储 4.1、数据进FIFO设计思路 4.2、数据出FIFO设计思路 5、数据回读 1、概述 工作中DTC的冻结帧与扩展数据功能一般用于存储故障发生时刻的一些关键数…

Unity Apple Vision Pro 保姆级开发教程 - Simulator 模拟器使用

教程视频 Apple VisionPro Simulator 模拟器使用教程 Unity Vision Pro 中文课堂教程地址: Unity3D Vision Pro 开发教程【保姆级】 | Unity 中文课堂 ​ VsionOS Simulator 简介 visionOS Simulator 是一个用于开发和测试 visionOS 应用程序的工具。它模拟 Appl…

数仓模型规范设计

模型架构设计 数仓架构一般从宏观上分为三层:操作数据层ODS、公共维度模型层CDM和数据应用层ADS。其中CDM又包含明细数据层DWD、汇总数据层DWS,维度层DIM、根据生产经验这里可在加入数据临时层TMP。架构图如下: ODS 把操作系统的数据几乎无…

高中数学:立体几何-外接球的外心法

文章目录 一、外心法定义二、习题1、例题一2、例题二3、例题三4、例题四 一、外心法定义 依然以三棱锥为例 即,找到三棱锥的外接球的球心,从而可以确定出外接球的半径R。 而三棱锥有四个顶点,这四个顶点必然都在外接球的球面上。 寻找思路…

海蓝色主题移动端后台UI作品集模板源文件分享 figmasketch格式

页面数量:30页 页面尺寸:1920*1080px 发给你的文件:作品集Figma源文件、作品集sketch源文件、部字体文件、高质量作品集包装psd样机文件(含手机和电脑样机)

设计模式概览

设计模式是一种解决常见编程问题的经验总结,提供了代码的可重用性、可扩展性和可维护性。常见的设计模式有23个,主要分为三大类:创建型模式、结构型模式和行为型模式。下面是这三类设计模式的详细分类和讲解: 一、创建型模式 创建…

linux多窗口调试一些常用命令

在 vim 或 neovim 中使用分屏移动光标的方式: 希望光标从左窗口移动到右侧窗口: 按 Ctrlw 然后按 l(小写的 L),光标就会从左边窗口移动到右边窗口。 其它分屏操作: Ctrlw h:移动到左边的窗…

【我的 RT 学习手札】信息收集

相关笔记整理自B站up主泷羽sec全栈渗透测试教学(免费) 视频链接为泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 笔记只是方便师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线&#xff0…

11 图书借阅功能实现(Vue3+element plus +Spring Boot)

目录 1 功能描述2 接口地址3 后端代码4 api/book.js中编写借阅图书的接口代码5 BookResourcesVue.vue组件中完成点击事件borrowBook6 功能演示 1 功能描述 普通用户借阅图书,点击借阅按钮,修改图书状态,最多能够借阅3本图书。 2 接口地址 …

保证缓存一致性的常用套路

缓存更新的套路 看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是…

[MyBatis-Plus]扩展功能详解

代码生成 使用MP的步骤是非常固定的几步操作 基于插件, 可以快速的生成基础性的代码 安装插件安装完成后重启IEDA连接数据库 mp是数据库的名字?serverTimezoneUTC 是修复mysql时区, 不加会报错 生成代码 TablePrefix选项是用于去除表名的前缀, 比如根据tb_user表生成实体类U…

恒定电流下有功率密度,功率密度体积分就是恒定电流的功率

体积趋于0时,体积的功率就叫功率密度 恒定电流的 电场乘距离等于电压 电流面密度*面积等于电流注意:电流面密度不是电荷线面体密度,电荷线面体密度用在静电场中,即电荷不运动这种

redo文件误删除后通过逻辑备份进行恢复

问题描述 开发同事让在一个服务器上查找下先前库的备份文件是否存在,如果存在进行下恢复。翻了服务器发现备份文件存在,多愁了一眼竟翻到了该备份文件于2024.6.17日恢复过的日志,赶紧和开发沟通说2024.6.17号已经恢复过了为啥还要恢复&#x…

ESP32_S3驱动舵机servor sg90

ESP32_S3驱动舵机servor sg90 硬件连接图硬件外观[^1]硬件引脚功能图硬件连接引脚对照表硬件接线图 Arduino IDE添加ESP32_S3开发板[^2]安装SERVO3舵机驱动库[^3]下载库ZIP包安装库 ESP32_S3程序下载方式源代码SERVO库自带例程方式二 参考文献 调试ESP32_S3舵机发现舵机不动。查…

多线程编程

使用多线程完成两个文件的拷贝&#xff0c;分支线程1&#xff0c;拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程用于回收分支线程的资源 #include<myhead.h>typedef struct sockaddr_in addr_in_t; typedef struct sockaddr addr_t; typedef struct soc…