# 最大客户客户端并发数量,对使用线程和协程的worker的工作有影响
worker_connections = 1200
# 进程名称
proc_name = 'gunicorn.pid'
# 进程pid记录文件
pidfile = 'app_run.log'
# 日志等级
loglevel = 'debug'
# 日志文件名
logfile = 'debug.log'
# 访问记录
accesslog = 'access.log'
# 访问记录格式
access_log_format = '%(h)s %(t)s %(U)s %(q)s'
黑马程序员免费视频库:http://yun.itheima.com?2020sxkyk
# 运行方式 命令行
gunicorn -c gunicorn_config.py flask_server:app
使用 meinheld + gunicorn + flask 开启高并发神器
前提在虚拟环境中安装meinheld:
pip install meinheld
import multiprocessing
\的配置文件\
# 预加载资源
preload_app = True
# 绑定
bind = \
# 进程数: cup数量 * 2 + 1
workers = multiprocessing.cpu_count() * 2 + 1
# 线程数 cup数量 * 2
黑马程序员免费视频库:http://yun.itheima.com?2020sxkyk
threads = multiprocessing.cpu_count() * 2
# 等待队列最大长度,超过这个长度的链接将被拒绝连接
backlog = 2048
# 工作模式
worker_class = \
# 最大客户客户端并发数量,对使用线程和协程的worker的工作有影响
worker_connections = 1200
# 进程名称
proc_name = 'gunicorn.pid'
# 进程pid记录文件
pidfile = 'app_run.log'
# 日志等级
loglevel = 'debug'
# 日志文件名
黑马程序员免费视频库:http://yun.itheima.com?2020sxkyk
logfile = 'debug.log'
# 访问记录
accesslog = 'access.log'
# 访问记录格式
access_log_format = '%(h)s %(t)s %(U)s %(q)s'
# 运行方式 命令行
gunicorn -c gunicorn_config.py flask_server:app
拓展
概念:协程就是协同工作的程序,不是进程也不是线程 理解成--不带返回值的函数调用。
Coroutine:协程,又称微线程,纤程。
协程的这种“挂起”和“唤醒”机制实质上是将一个过程切分成了若干个子过程,给了我们一种以扁平的方式来使用事件回调模型。优点:共享进程的上下文,一个进程可以创建百万,千万的coroutine。
python中的yield和第三方库greenlet,都可以实现协程。
黑马程序员免费视频库:http://yun.itheima.com?2020sxkyk
greenlet 提供了在协程中直接切换控制权的方式,比生成器(yield)更加灵活、简洁。
历史遗留问题—GIL锁
1.线程安全是在多线程的环境下,线程安全能够保证多个线程同时执行时程序依旧运行正确,而且要保证对于共享的数据,可以由多个线程存取,但是同一时刻只能有一个线程进行存取。每一个interpreter进程,只能同时仅有一个线程来执行,获得相关的锁,存取相关的资源。那么很容易就会发现,如果一个interpreter进程只能有一个线程来执行,多线程的并发则成为不可能,即使这几个线程之间不存在资源的竞争。
2.所以虽然 CPython的线程库直接封装操作系统的原生线程,但CPython进程做为一个整体同一时间只会有一个获得了GIL的线程在跑,其它的线程都处于等待状态等着 GIL的释放。所以只能使用cpu单核。这也是python多线程被人诟病的原因。
解决方案:python的高并发更加推荐多进程+协程 io多路复用
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。
1. select(线程不安全):它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。
黑马程序员免费视频库:http://yun.itheima.com?2020sxkyk