[英]Quit multithreaded/multi-process web server
我正在編寫一個http服務器。 主守護進程會產生一堆偵聽器,這些偵聽器是線程或進程,具體取決於用戶設置。 創建一個監聽器后,套接字描述符被傳遞給它,它的工作就是監聽連接(duh)。 信號量是包裝調用listen
,以避免驚群效應。
我的問題是如何退出服務器。 在這種情況下,監聽器在信號量上被阻塞,守護進程如何告訴它們關閉? 守護進程不能只是殺死它們,也許某人正在響應請求......
我想讓設計盡可能簡單,但我無法找到解決這個問題的方法。
這是一些丑陋的解決方法:
你說什么? 謝謝。
發送一個SIGTERM,或者,如果您願意,還可以向孩子發送SIGUSR並實現對此信號的處理,以便他們完成當前請求並優雅地退出。 如果他們等待信號量,你應該使用可中斷模式,以便接收信號將其喚醒。
解決此問題的一種簡潔方法是使每個偵聽器等待兩個信號量。 第一個是你現在使用的第一個,第二個是當發出信號時,表示是時候退出了。 我相信你的系統是linux,因為你使用術語daemon
。 函數select
就是這樣 - 等待多個對象(像文件描述符一樣),並在其中一個成為信號時返回。 你也可以從函數中知道哪個有信號,所以這是你的解決方案。
在Windows上,函數是WaitForMultipleObjects()
在過去,我使用了一個全局客戶端處理線程可以用來查明他們是否需要“清理商店”然后等待他們全部完成但我也有興趣知道是否有更好的方法。 (不確定是什么語言,但在大多數情況下,您可以檢查您的線程是否仍在運行。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.