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中的并发请求的更多相关文章

  1. Web大规模高并发请求和抢购的解决方案

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

  2. 多套方案来提高python web框架的并发处理能力

    Python常见部署方法有 :   fcgi :用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http 服务互动 wsgi :利用http服务的mod_wsgi模 ...

  3. python Web中WSGI uWSGI 以及 uwsgi的区别

    WSGI协议 首先弄清下面几个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web ...

  4. python web开发-flask访问请求数据request

    Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#fla ...

  5. python编程中的并发------多进程multiprocessing

    任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...

  6. python web中的文件上传与下载

    django 框架下 实现服务端的文件上传与下载: import jsonimport osimport uuid def attachment_upload(request): "&quo ...

  7. python编程中的并发------协程gevent模块

    任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...

  8. python编程中的并发------多线程threading模块

    任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...

  9. java中如何模拟真正的同时并发请求?

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

随机推荐

  1. 【Java】Java-fastjson-基本使用方法

    Java-fastjson-基本使用方法 fastjson maven_百度搜索 Maven Repository: com.alibaba » fastjson » 1.2.44 fastjson ...

  2. 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

    http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...

  3. 转:写的不错的eclipse配置cdt的文章

    http://jingpin.jikexueyuan.com/article/22803.html

  4. error MSB6006: "CL.exe" exited with code -1073741819.

    编译一个c++项目的时候,会报如下的错误,总是无法编译,是怎么回事? error MSB6006: "CL.exe" exited with code -1073741819. 搜 ...

  5. Android Toast 使用总结

    本文内容 环境 演示 Toast 使用 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 三星 SM-G3508,Android OS ...

  6. 彻底解决 Intellij IDEA 卡顿 优化笔记,重要的快捷键

    由于工作中经常出现分支各种切换,使用Eclipse便不再像以前那么舒服了,不停的修改工作空间,每次修改完工作空间又是一堆一堆的个性化设置,来回的切换,真的很累.我们做软件的,怎么能不去尝试新鲜的呢,毕 ...

  7. Discuz常见小问题-如何批量加精,置顶帖子

    批量选中帖子,然后置顶和精华都可以勾选 完成之后的效果

  8. 求两个有序数组的中位数或者第k小元素

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 设两个数组分别是vec1和vec2,元素数目分别是n1.n2. 算法1:最简单的办法就是把两个数 ...

  9. Sqlite执行insert or ignore 或insert or replace语句。

    Sqlite执行insert or ignore 或insert or replace语句. ,); ,); 上面的第一条语句是每次执行时,如果不存在,则添加,如果存在,则更新. 上面的第二条语句是每 ...

  10. 基于Android的百度地图实现输入地址返回经纬度信息

    1 解决方案一 此处解决办法参照自网友文章,对于输入的地址信息要求:城市名+具体地址名. 如果输入的地址信息只有具体地址名,而没有城市名,可能解析不出经纬度信息.还有就是解析出的经纬度再反向解析显示再 ...