python web中的并发请求
python web可以选择django,也可以选择flask,它们的原理差不多。flask比较轻量,下面写一段flask程序来说明python web对并发请求的处理。
app.py
import time
app = Flask()
@app.route('/')
def index():
time.sleep(5) # 单位秒
return render_temple('index.html')
如果使用python app.py命令启动此程序,则相当于单进程启动。两个人访问此web程序必然导致一个人会等待很久。也就是说,python app.py启动的是开发时的服务器,这个服务器是单进程的,这种启动方式只能用于开发时,不能用于部署。
如果部署,推荐使用gunicorn(green unicorn,绿色的独角兽)。使用gunicorn app -w 2 -b :8000命令,-w参数表示worker数,也就是此WEB程序开启的进程数,gunicorn会维护一个进程池来响应用户请求,开几个进程就表示并发量是多少。因为Python线程垃圾,只能使用进程了。
下面举一个更完整的例子来证明开发服务器无法处理并发请求。
from flask import Flask
import time
import requests
import multiprocessing
app = Flask("haha")
@app.route("/")
def haha():
time.sleep(10)
return "haha"
def go():
time.sleep(3) # 等待3秒钟,等服务器启动
print(multiprocessing.current_process().name, "start request", time.time())
resp = requests.get("http://localhost:5000/")
print(resp.text)
print(multiprocessing.current_process().name, "end request", time.time())
if __name__ == '__main__':
multiprocessing.Process(target=go).start()
multiprocessing.Process(target=go).start()
app.run(debug=False) # debug=True会导致程序启动两次
程序输出为
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Process-2 start request 1513270644.646835
Process-1 start request 1513270644.646835
127.0.0.1 - - [15/Dec/2017 00:57:35] "GET / HTTP/1.1" 200 -
haha
Process-2 end request 1513270655.6805644
haha
127.0.0.1 - - [15/Dec/2017 00:57:45] "GET / HTTP/1.1" 200 -
Process-1 end request 1513270665.6937685
显然,两个同时启动的进程,等待回复的时间却不一样,表明服务器只有一个worker在运行。如果把上述python文件中的多进程请求改为多线程请求,也能够看到类似的效果。
使用python app.py命令进行部署,只会造成并发性低,造成加载等待时间长、ajax请求时间长等问题,并不会发生错误。
参考资料
https://segmentfault.com/q/1010000004532745
python web中的并发请求的更多相关文章
- Web大规模高并发请求和抢购的解决方案
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...
- 多套方案来提高python web框架的并发处理能力
Python常见部署方法有 : fcgi :用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http 服务互动 wsgi :利用http服务的mod_wsgi模 ...
- python Web中WSGI uWSGI 以及 uwsgi的区别
WSGI协议 首先弄清下面几个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web ...
- python web开发-flask访问请求数据request
Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#fla ...
- python编程中的并发------多进程multiprocessing
任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...
- python web中的文件上传与下载
django 框架下 实现服务端的文件上传与下载: import jsonimport osimport uuid def attachment_upload(request): "&quo ...
- python编程中的并发------协程gevent模块
任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...
- python编程中的并发------多线程threading模块
任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...
- java中如何模拟真正的同时并发请求?
有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...
随机推荐
- 异常捕获 UncaughtExceptionHandler MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- SQL Server 2005 Integration Services (SSIS)数据源之MySQL
一安装MySQL数据库的ODBC驱动 下载MySQL Connector ODBC 3.51.rar 单击setup按默认安装即可! 如下图所示,在ODBC数据源管理器中看到“MySQL ODBC 3 ...
- 中文分词 coreseek安装笔记
#!/bin/bash # create by lhb # date 2013-11-26 # coreseek install script apt-get install make gcc g++ ...
- 转:Deep learning系列(十五)有监督和无监督训练
http://m.blog.csdn.net/article/details?id=49591213 1. 前言 在学习深度学习的过程中,主要参考了四份资料: 台湾大学的机器学习技法公开课: Andr ...
- OpenNebula学习第三节之虚拟机管理
一.背景 已经安装好OpenNebula-Front-end 已经安装好OpenNebula Node 已经把Node注册到Front-end 二.目标 看过第一.二节的同学们可能已经知道我的整个环境 ...
- LNMP(Linux+Nginx+MySQL+PHP)centos6.4安装
nginx命令 停止nginx服务:# /etc/init.d/nginx stop 启动nginx服务:# /etc/init.d/nginx start 编辑nginx配置文件:# vim /et ...
- Java 之 POI各Jar包作用
目前POI的最新版本是 3.16-beta2,该版本是测试版本,稳定版本是 3.15,下载地址为 Apache POI (http://poi.apache.org/download.html). 一 ...
- VCAP5-DCA Objective 1.3 – Configure and Manage Complex Multipathing and PSA Plug-ins
http://virtuallyhyper.com/2012/10/vcap5-dca-objective-1-3-configure-and-manage-complex-multipathing- ...
- NetCore中使用DynamicExpresso、Z.Expressions、LambdaParser进行安字符串求值
例子如下: Z.Expressions从2.0开始支持了NetCore,但是收费的.其它两者免费.建议使用DynamicExpresso,免费而且速度快.LambdaParser目前支持太少. sta ...
- gson 忽略掉某些字段不进行转换
增加 transient 修饰进行解决,例如: private transient final DecimalFormat df = new DecimalFormat("#0.00&qu ...