gunicorn开发时候如何自动重启

news/2025/1/3 17:38:47/

在使用 Gunicorn 开发时,自动重启是一个很常见的需求,尤其在调试和开发过程中。Gunicorn 本身并没有直接支持文件监控和自动重启的功能,但可以通过以下几种方法实现:


方法 1:使用 --reload 选项

Gunicorn 提供一个内置的 --reload 参数,可以在开发环境中使用。它会监控应用程序的 Python 源代码文件,如果文件发生变化,则自动重启服务。

启动命令示例:
gunicorn --reload -w 2 -b 127.0.0.1:8000 myapp:app
  • --reload: 开启自动重载功能。
  • -w 2: 指定 2 个 worker 进程。
  • -b 127.0.0.1:8000: 绑定到本地的 8000 端口。
  • myapp:app: 指定模块名和 WSGI 应用实例。

注意

  • 仅适用于开发环境,不推荐在生产环境中使用。
  • 监控文件的变更可能增加系统开销。

方法 2:结合 watchdog 实现更高级的文件监控

如果需要监控更复杂的文件变化(例如配置文件、静态文件等),可以使用 Python 的 watchdog 模块监控文件,并在文件变化时重启 Gunicorn。

安装 watchdog
pip install watchdog
示例代码:

创建一个脚本,例如 auto_reload.py

python">from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import os
import signal
import time
import subprocessclass ReloadHandler(FileSystemEventHandler):def __init__(self, gunicorn_pid):self.gunicorn_pid = gunicorn_piddef on_modified(self, event):print(f"File changed: {event.src_path}. Restarting Gunicorn...")os.kill(self.gunicorn_pid, signal.SIGHUP)if __name__ == "__main__":# 启动 Gunicorngunicorn_process = subprocess.Popen(["gunicorn", "-w", "2", "-b", "127.0.0.1:8000", "myapp:app"])gunicorn_pid = gunicorn_process.pid# 监控当前目录文件的变化event_handler = ReloadHandler(gunicorn_pid)observer = Observer()observer.schedule(event_handler, path=".", recursive=True)try:observer.start()while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()# 停止 Gunicorngunicorn_process.terminate()
运行脚本:
python auto_reload.py

特点

  • 可监控任意文件夹和文件类型。
  • 可自定义触发重启的条件。
  • 增加了灵活性,但稍微复杂一些。

方法 3:使用 supervisorsystemd 配合文件监控

你可以使用 supervisorsystemd 来管理 Gunicorn 的进程,同时配合 inotify 等文件监控工具触发进程重启。

使用 inotify-tools 示例:
  1. 安装 inotify-tools

    sudo apt install inotify-tools
    
  2. 创建一个文件监控脚本:

    #!/bin/bash
    while inotifywait -e modify,create,delete -r /path/to/your/project; doecho "File changes detected. Restarting Gunicorn..."pkill gunicorngunicorn -w 2 -b 127.0.0.1:8000 myapp:app &
    done
    
  3. 运行脚本:

    bash watch_and_reload.sh
    

方法 4:使用 honchoforeman

可以使用工具如 honchoforeman 来同时运行 Gunicorn 和文件监控脚本。你可以在 Procfile 中定义任务:

示例 Procfile
web: gunicorn --reload -w 2 -b 127.0.0.1:8000 myapp:app
watch: python watch_files.py

然后用 honcho 运行:

honcho start

总结

  • 简单场景:直接使用 Gunicorn 的 --reload 参数。
  • 复杂场景:结合 watchdoginotify-tools 实现精细化文件监控。
  • 生产环境:自动重启通常不适用,应使用工具如 supervisorsystemd 配合手动触发的方式。

http://www.ppmy.cn/news/1559839.html

相关文章

2024年12月27日Github流行趋势

项目名称:anti-work / shortest 项目维护者:m2rads slavingia danthomps juniusfree wiksien项目介绍:通过自然语言AI进行的QA测试。项目star数:2,272项目fork数:129 项目名称:lobehub / lobe-chat 项目维…

每天40分玩转Django:Django Channels

Django Channels 一、今日学习内容概览 知识模块重点内容难度系数WebSocket基础WebSocket协议、连接建立、消息传输★★★★☆消息路由URL路由配置、消费者编写、消息处理★★★★☆Channels配置项目配置、ASGI应用、Channel Layers★★★☆☆ 二、WebSocket基础 1. 环境配…

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】 1.1 漏洞分析1.2 漏洞合约1.3 攻击分析1.4 攻击合约 重点:MaxMint721 漏洞合约的 mint 函数调用了 ERC721 合约中的 _checkOnERC721Received 函数,触发 to 地址中实…

3.阿里云flinkselectdb-py作业

1.概述 Python API中文文档 本文介绍在阿里云实时计算flink中使用python作业,把oss中的数据同步数据到阿里云selectdb的过程。python简单的语法特性更适合flink作业的开发; 先说结论: 在实际开发中遇到了很多问题,导致python作业基本基本无法…

.net core 的软件开发工具

Python基础 Python是一种高级编程语言,由吉多范罗苏姆(Guido van Rossum)于1991年首次发布。Python的设计哲学强调代码的可读性和简洁的语法,使得编写和阅读代码变得更加直观。随着时间的推移,Python成为了全球最受欢…

微信小程序 单选多选radio/checkbox 纯代码分享

单选按钮 <radio-group class"radiogroup" bindchange"radioChange"> <label class"radio" wx:for"{{items}}"> <radio value"{{item.name}}" checked"{{item.checked}}" /> {{item.value}} &…

永磁同步电动机直接转矩控制的研究

永磁同步电动机&#xff08;PMSM&#xff09;因其高效率和高功率密度&#xff0c;越来越多地应用于现代工业驱动和电动交通工具中。直接转矩控制&#xff08;DTC&#xff0c;Direct Torque Control&#xff09;作为一种先进的电动机控制方法&#xff0c;因其能够实现对电机转矩…

vim里搜索关键字

vim是linux文本编辑器的命令&#xff0c;再vi的基础上做了功能增强 使用方法如下 1. / 关键字, 回车即可, 按n键查找关键字下一个位置 2.? 关键字, 回车即可, 按n键查找关键字下一个位置 3.示例