01、uwsgi、gunicorn如何實現優雅重啟

来源:https://www.cnblogs.com/huageyiyangdewo/archive/2023/04/10/17303182.html
-Advertisement-
Play Games

多態 編譯時的多態:方法重載 運行時的多態:動態綁定 多態的三大前提 類之間要有繼承關係 要出現方法重寫 父類的引用指向了子類的對象 測試樣例 // 定義Person類 public class Person { public String name; public String sex; publ ...


1、為何需要優雅重啟

在實際開發過程中,我們會不斷迭代升級產品,每次迭代後,都需要線上上伺服器更新代碼。一般小公司的迭代升級,是沒有做到像金絲雀發佈或者使用到kubernetes這些東西的。那如何保證更新的時候,之前接收到的請求能夠正常處理完成呢,這個時候就需要實現優雅重啟了。

那如何實現優雅重啟呢,其實,我們部署python web服務所用到的uwsgi和gunicorn已經實現了優雅重啟了,下麵就講講如何實現優雅重啟

2、uwsgi 如何實現優雅重啟

以下實驗是基於以下版本進行的。

python3.6.8

flask==2.0.3
uwsgi==2.0.21

2.1 編寫 web 服務

main.py

import time

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    time.sleep(10)
    return "hello eeee"


if __name__ == "__main__":
    app.run()

2.2 編寫 uwsgi.ini 配置文件

[uwsgi]
#uwsgi啟動時,所使用的地址和埠(這個是http協議的)
http=0.0.0.0:8000
#指向網站目錄
chdir=./
#python 啟動程式文件
wsgi-file=main.py
#python 程式內用以啟動的application 變數名
callable=app
#處理器數
processes=4
#線程數
threads=2

#####實現優雅重啟添加下麵兩行配置即刻#####
lazy-apps = true
#監聽 test.txt 文件 當 test.txt 發生改變時優雅重啟uwsgi。這個名字可以隨便起
touch-chain-reload = /Users/xx/work/test/py_test/sample_test/flask_graceful_restart/test.txt

2.3 啟動uwsgi 服務

uwsgi --ini uwsgi.ini

2.4 測試優雅重啟

1、請求 http://127.0.0.1:8000/

2、更新 main.py 中返回的內容,改為: return "hello xxxxx"

2、在/Users/xx/work/test/py_test/sample_test/flask_graceful_restart 目錄下,執行 touch test.txt。有這個文件時,更改這個文件的內容也可以優雅重啟 uwsgi 服務

3、得到第一步的返回結果,返回結果為:"hello eeee"

5、再次請求 http://127.0.0.1:8000/ ,返回結果為:"hello xxxxx"

通過上述測試,可以發現實現了優雅重啟。

優雅重啟的日誌過程:

整個時間還挺久的,差不多4分鐘。

開始:12:14:45。

結束:12:18:57。

1、先查看 uwsgi 進程信息

501  7758  4633   0 12:13PM ttys005    0:00.04 uwsgi --ini uwsgi.ini
501  7759  7758   0 12:13PM ttys005    0:00.27 uwsgi --ini uwsgi.ini
501  7760  7758   0 12:13PM ttys005    0:00.27 uwsgi --ini uwsgi.ini
501  7761  7758   0 12:13PM ttys005    0:00.27 uwsgi --ini uwsgi.ini
501  7762  7758   0 12:13PM ttys005    0:00.26 uwsgi --ini uwsgi.ini
501  7763  7758   0 12:13PM ttys005    0:00.00 uwsgi --ini uwsgi.ini
501  7789  6013   0 12:13PM ttys006    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox uwsgi

2、生成 test.txt 時的現象:當 出現 chain reloading complete 時,代表了優雅完成。

Mon Apr 10 12:14:45 2023 - *** /Users/mashili/work/test/py_test/sample_test/flask_graceful_restart/test.txt has been touched... chain reload !!! ***
Mon Apr 10 12:14:45 2023 - chain next victim is worker 1
Gracefully killing worker 1 (pid: 7759)...
Mon Apr 10 12:15:46 2023 - worker 1 (pid: 7759) is taking too much time to die...NO MERCY !!!
worker 1 killed successfully (pid: 7759)
Respawned uWSGI worker 1 (new pid: 7847)
Mon Apr 10 12:15:47 2023 - chain is still waiting for worker 1...
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7fc33e00da00 pid: 7847 (default app)
Mon Apr 10 12:15:48 2023 - chain next victim is worker 2
Gracefully killing worker 2 (pid: 7760)...
Mon Apr 10 12:16:49 2023 - worker 2 (pid: 7760) is taking too much time to die...NO MERCY !!!
worker 2 killed successfully (pid: 7760)
Respawned uWSGI worker 2 (new pid: 7885)
Mon Apr 10 12:16:50 2023 - chain is still waiting for worker 2...
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7fc33e00da00 pid: 7885 (default app)
Mon Apr 10 12:16:51 2023 - chain next victim is worker 3
Gracefully killing worker 3 (pid: 7761)...
Mon Apr 10 12:17:52 2023 - worker 3 (pid: 7761) is taking too much time to die...NO MERCY !!!
worker 3 killed successfully (pid: 7761)
Respawned uWSGI worker 3 (new pid: 7905)
Mon Apr 10 12:17:53 2023 - chain is still waiting for worker 3...
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7fc33e00da00 pid: 7905 (default app)
Mon Apr 10 12:17:54 2023 - chain next victim is worker 4
Gracefully killing worker 4 (pid: 7762)...
Mon Apr 10 12:18:55 2023 - worker 4 (pid: 7762) is taking too much time to die...NO MERCY !!!
worker 4 killed successfully (pid: 7762)
Respawned uWSGI worker 4 (new pid: 7910)
Mon Apr 10 12:18:56 2023 - chain is still waiting for worker 4...
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7fc33e00da00 pid: 7910 (default app)
Mon Apr 10 12:18:57 2023 - chain reloading complete

3、優雅重啟過程中,查看進程信息。ps -ef|grep uwsgi

發現即存在新的進程,也存在老的進程。測試的時候,發現,優雅重啟過程中,並不一定會將重啟過程中的請求轉發到新的進程中去。

  501  7758  4633   0 12:13PM ttys005    0:00.08 uwsgi --ini uwsgi.ini
  501  7761  7758   0 12:13PM ttys005    0:00.27 uwsgi --ini uwsgi.ini
  501  7762  7758   0 12:13PM ttys005    0:00.26 uwsgi --ini uwsgi.ini
  501  7763  7758   0 12:13PM ttys005    0:00.00 uwsgi --ini uwsgi.ini
  501  7847  7758   0 12:15PM ttys005    0:00.26 uwsgi --ini uwsgi.ini
  501  7885  7758   0 12:16PM ttys005    0:00.26 uwsgi --ini uwsgi.ini
  501  7889  6013   0 12:17PM ttys006    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox uwsgi

2.5 線上如何更新

1、首先將代碼更新到伺服器。

2、ps -ef|grep uwsgi 查看現在的進程號。

2、查看 test.txt是否存在,存在就更新文件內容,不存在就生成 test.txt。

3、觀察uwsgi的日誌或者進程,待所有的worker進程都重啟生成後,即完成了優雅重啟。

3、gunicorn 如何實現優雅重啟

3.1 編寫 web 服務

main.py

import time

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    # time.sleep(3)
    return "hello fdaf fdafd "


if __name__ == "__main__":
    app.run()

3.2 編寫 conf.py 配置gunicorn 文件

conf.py

# 是否開啟debug模式
debug = True
# 訪問地址
bind = "0.0.0.0:8888"
# 工作進程數
workers = 2
# 工作線程數
threads = 2
# 超時時間
timeout = 600
# 輸出日誌級別
loglevel = 'info'
# 存放日誌路徑
pidfile = "log/gunicorn.pid"
# 存放日誌路徑
accesslog = "log/access.log"
# 存放日誌路徑
errorlog = "log/debug.log"

######註意,下麵這個不能加,加了就不能達到優雅重啟的效果,切記切記!!
# gunicorn + apscheduler場景下,解決多worker運行定時任務重覆執行的問題
# preload_app = True

3.3 啟動 gunicorn 服務

gunicorn -c conf.py main:app

3.4 測試優雅重啟

1、pstree -ap|grep gunicorn 找到主進程

pstree -ap|grep gunicorn

2、執行 kill -HUP masterpid

kill -HUP 1540847

3、再次 執行 pstree -ap|grep gunicorn,發現worker 進程id不一樣後,即更新完成。或者查看日誌

[2023-04-10 15:36:51 +0800] [11623] [INFO] Handling signal: hup
[2023-04-10 15:36:51 +0800] [11623] [INFO] Hang up: Master
[2023-04-10 15:36:51 +0800] [11681] [INFO] Booting worker with pid: 11681
[2023-04-10 15:36:51 +0800] [11682] [INFO] Booting worker with pid: 11682
[2023-04-10 15:36:51 +0800] [11644] [INFO] Worker exiting (pid: 11644)
[2023-04-10 15:36:51 +0800] [11645] [INFO] Worker exiting (pid: 11645)

3.5 線上如何更新

1、通過 pstree -ap|grep gunicorn 找到主進程ID

2、執行 kill -HUP masterpid 命令

3、等待gunicorn優雅重啟完成


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在開發過程中遇到一個sqlalchemy lost connection的報錯,記錄解決方法。 報錯信息 python後端開發,使用的框架是Fastapi + sqlalchemy。在一個介面請求中報錯如下: [2023-03-24 06:36:35 +0000] [217] [ERROR] E ...
  • 1、原視頻地址 https://www.bilibili.com/video/BV1ME411A73k/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=33b50a4dd201d ...
  • P1 Collection介面和常用方法 一、Collection介面實現類的特點 public interface Collection extends Iterable Collection實現子類可以存放多個元素,每個元素可以是Object。 有些Collection的實現類,可以存放重覆的元 ...
  • SpringCloud Ribbon 1.Ribbon介紹 1.1Ribbon是什麼? 官網地址:Netflix/ribbon: Ribbon(github.com) SpringCloud Ribbon 是基於 Netflix Ribbon 實現的一套客戶端負載均衡的工具 Ribbon 主要功能是 ...
  • 前言 在上一篇文章中,我們介紹了&運算符的基礎用法,本篇文章,我們將介紹& 運算符的一些高級用法。 一、人物簡介 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。 二、位掩碼 位掩碼是一種用於按位操作的技術 它通過使用一個二進位數 ...
  • Excelize 是 Go 語言編寫的用於操作 Office Excel 文檔基礎庫,2023年4月10日,社區正式發佈了 2.7.1 版本,該版本包含了多項新增功能、錯誤修複和相容性提升優化。 ...
  • JavaWeb 中 “轉發”與 “重定向”的區別 每博一文案 人生的常態,就是有聚有散,有得有失,就像山峰一樣,總有高低,起伏不斷。 曾經,我們是鮮衣怒馬的少年,一日看盡長安花。 走著走著,漸漸明白生活並不都是盡心盡情的,萬事萬物都有力所不能及之處。此時我們能做的,就是看透,看清,看淡。 走著走著, ...
  • 在 Go 語言中,讀取 Excel 數據可以使用第三方庫 github.com/tealeg/xlsx,該庫提供了豐富的 API,可以方便地讀取和操作 Excel 文件。 以下是一個簡單的示例代碼,演示瞭如何使用 github.com/tealeg/xlsx 庫讀取 Excel 文件: import ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...