python-flask-gunicorn-并发

使用flask框架进行web开发的时候,默认情况是单一的进程。当出现并发请求,就会出现排队现象。
解决:

  1. 开发环境, threaded=True
    if __name__ == '__main__':
        # 多进程与多线程不能同时开启
        #app.run('0.0.0.0', port=5001, threaded=False, processes=3)  # 适用多进程启动服务
        #app.run('0.0.0.0', port=5001, threaded=True)  # 适用多线程启动服务
    
  2. 生产环境,使用gunicorn部署
    python常见的web部署搭配nginx+gunicorn。

一、gunicorn安装

pip install gunicorn

二、配置参数详解

参考:
1、Gunicorn配置部分的翻译
2、Gunicorn-配置详解
3、python之gunicorn的配置
4、gunicorn官方文档
具体参数如下:

[2019-07-04 19:37:21 +0800] [31677] [DEBUG] Current configuration:
  config: /home/gunicorn/config.py
  bind: ['172.28.171.98:8080']
  backlog: 2048
  workers: 1
  worker_class: sync
  threads: 1
  worker_connections: 1000
  max_requests: 0
  max_requests_jitter: 0
  timeout: 600
  graceful_timeout: 30
  keepalive: 2
  limit_request_line: 4094
  limit_request_fields: 100
  limit_request_field_size: 8190
  reload: True
  reload_engine: auto
  reload_extra_files: []
  spew: False
  check_config: False
  preload_app: False
  sendfile: None
  reuse_port: False
  chdir: /home/260190/PycharmProjects/文档内容修订检测
  daemon: False
  raw_env: []
  pidfile: None
  worker_tmp_dir: None
  user: 1000
  group: 1000
  umask: 0
  initgroups: False
  tmp_upload_dir: None
  secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
  forwarded_allow_ips: ['127.0.0.1']
  accesslog: /home/260190/PycharmProjects/文档内容修订检测/gunicorn/access.log
  disable_redirect_access_to_syslog: False
  access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
  errorlog: /home/260190/PycharmProjects/文档内容修订检测/gunicorn/error.log
  loglevel: debug
  capture_output: True
  logger_class: gunicorn.glogging.Logger
  logconfig: None
  logconfig_dict: {}
  syslog_addr: udp://localhost:514
  syslog: False
  syslog_prefix: None
  syslog_facility: user
  enable_stdio_inheritance: False
  statsd_host: None
  statsd_prefix: 
  proc_name: None
  default_proc_name: main:app
  pythonpath: None
  paste: None
  on_starting: <function OnStarting.on_starting at 0x7fc33c6579d8>
  on_reload: <function OnReload.on_reload at 0x7fc33c657ae8>
  when_ready: <function WhenReady.when_ready at 0x7fc33c657bf8>
  pre_fork: <function Prefork.pre_fork at 0x7fc33c657d08>
  post_fork: <function Postfork.post_fork at 0x7fc33c657e18>
  post_worker_init: <function PostWorkerInit.post_worker_init at 0x7fc33c657f28>
  worker_int: <function WorkerInt.worker_int at 0x7fc33c47e0d0>
  worker_abort: <function WorkerAbort.worker_abort at 0x7fc33c47e1e0>
  pre_exec: <function PreExec.pre_exec at 0x7fc33c47e2f0>
  pre_request: <function PreRequest.pre_request at 0x7fc33c47e400>
  post_request: <function PostRequest.post_request at 0x7fc33c47e488>
  child_exit: <function ChildExit.child_exit at 0x7fc33c47e598>
  worker_exit: <function WorkerExit.worker_exit at 0x7fc33c47e6a8>
  nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7fc33c47e7b8>
  on_exit: <function OnExit.on_exit at 0x7fc33c47e8c8>
  proxy_protocol: False
  proxy_allow_ips: ['127.0.0.1']
  keyfile: None
  certfile: None
  ssl_version: 2
  cert_reqs: 0
  ca_certs: None
  suppress_ragged_eofs: True
  do_handshake_on_connect: False
  ciphers: TLSv1
  raw_paste_global_conf: []
[2019-07-04 19:37:21 +0800] [31677] [INFO] Starting gunicorn 19.9.0
[2019-07-04 19:37:21 +0800] [31677] [DEBUG] Arbiter booted
[2019-07-04 19:37:21 +0800] [31677] [INFO] Listening at: http://172.28.171.98:8080 (31677)
[2019-07-04 19:37:21 +0800] [31677] [INFO] Using worker: sync
[2019-07-04 19:37:21 +0800] [31680] [INFO] Booting worker with pid: 31680
[2019-07-04 19:37:21 +0800] [31677] [DEBUG] 1 workers
[2019-07-04 19:37:41 +0800] [31680] [DEBUG] worker: SIGWINCH ignored.
[2019-07-04 19:37:41 +0800] [31677] [INFO] Handling signal: winch
[2019-07-04 19:37:41 +0800] [31677] [DEBUG] SIGWINCH ignored. Not daemonized

三、项目中的配置文件config.py :

有的也写成gunicorn.conf,应该是一样的

import multiprocessing
bind = "127.0.0.1:5000"
# workers = multiprocessing.cpu_count() * 2 + 1
workers = 10
accesslog = '/home/gunicorn/access.log'  # 访问日志目录
errorlog  = '/home/gunicorn/error.log'  # 错误日志目录
capture_output = True  # 重定向标准输出到错误日志。默认为False。
timeout = 600  # 过期时间
loglevel = "debug"  # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置  
# debug、info、warning、error、critical
reload = True  # 重载 更改代码的时候重启workers, 只建议在开发过程中开启。
daemon = True  # 以守护进程形式来运行Gunicorn进程。其实就是将这个服务放到后台去运行。默认为False。

启动:gunicorn -c config.py main:app 或者 gunicorn -c gunicorn.conf main:app

三、总结

命令行运行 gunicorn -c config.py main:app ,开启10进程,超时时间为10min,服务后台运行,重定向标准输出到错误日志,输出错误日志,访问日志等。解决了之前总是用nohup python main.py >out.log 2>&1 &来启动Flask后台服务的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值