TL;DR

其实是浏览器同一个窗口下限制了对同一个url会执行串行操作。

1.参考

2.现象

我有一个WSGI APP,每次处理request都睡眠5秒。不管多进程、多线程、协程跑WSGI APP,同一个浏览器窗口,不同的标签页,同一个url,都是串行执行(一个接一个完成,不管gunicorn是多进程、多线程、协程的并发模式)。例如同一个浏览器窗口,3个标签页,都是花费15秒。

import time

from datetime import datetime

from wsgiref.validate import validator

from gunicorn import __version__

@validator

def app(environ, start_response):

"""Simplest possible application object"""

time_begin = datetime.now()

# time_being = time.time()

data = '{time_begin}{time_end}'

status = '200 OK'

response_headers = [

('Content-type', 'text/plain'),

('Content-Length', str(len(data))),

('X-Gunicorn-Version', __version__),

('Foo', 'B\u00e5r'), # Foo: Bår

]

time.sleep(5) # 关键在这。

# time_end = time.time() - time_begin

time_end = datetime.now() - time_begin

data = data.format(time_begin=time_begin, time_end='x')

data = bytes(data, encoding='utf-8')

start_response(status, response_headers)

return iter([data])

无论哪种模式,都是15秒。

gunicorn --workers=1 --threads=3 test1:app -b 0:9999 --log-level debug # 多线程

gunicorn --workers=3 --threads=1 test1:app -b 0:9999 --log-level debug # 多进程

gunicorn --workers=3 --threads=3 test1:app -b 0:9999 --log-level debug # 多进程 + 多线程

gunicorn --workers=1 --threads=1 test1:app -b 0:9999 --log-level debug # 协程

gunicorn --workers=3 --threads=3 test1:app -b 0:9999 --log-level debug -k gevent # 多进程 + 多线程 + 协程

3.疑问

这看上去不就不能并发嘛?说好的多进程、多线程、协程、Non-blocking I/O的并发模式呢?

4.本质

通过第一点“参考”,可以看出,这其实是浏览器的锅。浏览器同一个窗口(有不同标签页)对同一个url会串行化访问;其实浏览器还有另外一个限制(对同一个域名的资源有并发限制),这是另外一个问题了。

5.解决办法

方法一,浏览器同一个窗口,不同标签页,给同一个url加上一些冗余的query params就行了。例如,同一个窗口不同标签页同时访问一下三个url,返回的请求时间差不多在同一时间完成。

http://127.0.0.1:9999/?a=1

http://127.0.0.1:9999/?a=2

http://127.0.0.1:9999/?a=3

方法二,在浏览器不同窗口,或者不同浏览器访问同一个url,也可以“并发”。这是非常合理的。因为这绕过了浏览器的限制,而且代表了不同的client的request。

6.总结

其实这个看上去是问题的问题不是问题,因为线上真正的请求一般不会出现这些情况。因为线上的请求是来自不同的浏览器、不同的curl,或者说,不同的http client,那就没有浏览器这个小小的限制啦!

gunicorn多进程不死_WEB,gunicorn - 无论是多进程、多线程、协程模式,同一个浏览器窗口多个标签页访问同一个url,看上去不会并发的问题...相关推荐

  1. python爬虫02-提升爬取效率、多线程,多线程传参,多进程,线程及线程池概念,协程,多任务异步协程,异步请求aiohttp模块,视频站工作原理

    1.提升爬取效率 使用多线程,多进程,携程,异步 2.多线程 进程是资源单位,每个进程,都会有一个默认的主线程 线程是执行单位 执行多线程需要导包: from threading import Thr ...

  2. python中多进程+协程的使用以及为什么要用它

    前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...

  3. python 协程可以嵌套协程吗_Python实战异步爬虫(协程)+分布式爬虫(多进程)

    引言:我们在写爬虫时常会遇到这样的问题,当需要爬取多个URL时,写一个普通的基于requests库的爬虫程序爬取时间会很长.因为是顺序请求网页的,而网页请求和获得响应过程比较耗费时间,程序不得不等待获 ...

  4. python多进程反而慢_python 3.6 多进程的坑

    python 慢是事实, 但是你如果想让他快,使用cpython 也可以,但是前提在你不使用第三方包的情况下,你要用了numpy pandas ,cython 就无法使用了,那只有 使用python的 ...

  5. Flask+Gunicorn(协程)高并发的解决方法探究

    <div> 1.使用Flask的做服务器框架,可以以python code.py的方式运行,但这种方式不能用于生产环境,不稳定,比如说: 有一定概率遇到连接超时无返回的情况 1,通过设置a ...

  6. python并发编程之多进程、多线程、异步和协程

    转载 自 tyomcat: https://www.cnblogs.com/tyomcat/p/5486827.html 一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活 ...

  7. php协程 多线程,【swoole.2.01】多进程,多线程和协程

    前言 在体验swoole的协程功能之前,需要先知道多进程,多线程和协程的区别. 多进程 典型的多进程结构就是耳熟能详的master-worker结构.swoole本身也是由master-maneger ...

  8. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  9. Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型

    一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...

最新文章

  1. 20145101《Java程序设计》第4周学习总结
  2. 一次搞定OpenCV源码及扩展模块的编译与环境配置
  3. 从数据中心基础设施的视角来看 Facebook 机器学习的应用
  4. win10系统修改Intel VT-x时进入不了BIOS问题
  5. 批量删除某个目录下的 某类型文件方法
  6. MOV及MP4文件格式中几个重要的Table
  7. linux6.5安装oracle,linux [CentOS 6.5]下安装oracle
  8. red hat linux 安装oracle10g vm,oracle 10g 在 RED HAT ENTERPRISE LINUX 5下的安装
  9. pip/pip3 install 报错 “Could not find a version that satisfies the requriement xxx” 的解决方法
  10. es文件浏览器怎么用_python爬虫入门:什么是爬虫,怎么玩爬虫?
  11. Db4o for .NET 使用心得(1、2):Trace db4o;慎用struct
  12. excel表格斜线_老中医坐诊,专治Word表格各种不服
  13. 使用Photoshop的总结
  14. 硬件知识:台式电脑主机各种接口介绍
  15. 网络安全工程师的职业前景如何?
  16. mybatis高级操作及源码分析(一)
  17. JavaScript学习第十三天
  18. 牛视源码定制,抖音矩阵系统,别和谐啊、、、
  19. 计算机音乐西游记,86版《西游记》经典音乐十首,带你梦入西游!
  20. 基于esp32-cam的监控小车

热门文章

  1. Python基础教程:自定义函数
  2. 检测点是否在两条平行线段之间_解决最值问题的利器——垂线段最短
  3. 可控硅g极电阻值计算_可控硅的作用介绍及检测方法
  4. visual studio解决方案是什么?
  5. Executors框架——5种常用的线程池介绍及区别
  6. Nginx教程系列二:Linux安装nginx
  7. java继承机制实验报告_JAVA继承实验报告.doc
  8. springboot-cache的简单使用
  9. ie网络集合代理无法启动_网络故障诊断70例!经典老文了!
  10. 安卓怎么显示res文件夹中的html_使用Android WebView加载现有的.html文件