簡體   English   中英

退出多線程/多進程Web服務器

[英]Quit multithreaded/multi-process web server

我正在編寫一個http服務器。 主守護進程會產生一堆偵聽器,這些偵聽器是線程或進程,具體取決於用戶設置。 創建一個監聽器后,套接字描述符被傳遞給它,它的工作就是監聽連接(duh)。 信號量是包裝調用listen ,以避免驚群效應。

我的問題是如何退出服務器。 在這種情況下,監聽器在信號量上被阻塞,守護進程如何告訴它們關閉? 守護進程不能只是殺死它們,也許某人正在響應請求......

我想讓設計盡可能簡單,但我無法找到解決這個問題的方法。

這是一些丑陋的解決方法:

  • 設置信號量的超時。 醒來。 我應該關閉嗎? 沒有? 好的,回去睡覺;
  • 殺了他們;
  • 共享內存中的布爾數組,意思是響應/阻塞,守護程序相應地殺死。 到目前為止最好的,但不是那么簡單。

你說什么? 謝謝。

發送一個SIGTERM,或者,如果您願意,還可以向孩子發送SIGUSR並實現對此信號的處理,以便他們完成當前請求並優雅地退出。 如果他們等待信號量,你應該使用可中斷模式,以便接收信號將其喚醒。

解決此問題的一種簡潔方法是使每個偵聽器等待兩個信號量。 第一個是你現在使用的第一個,第二個是當發出信號時,表示是時候退出了。 我相信你的系統是linux,因為你使用術語daemon 函數select就是這樣 - 等待多個對象(像文件描述符一樣),並在其中一個成為信號時返回。 你也可以從函數中知道哪個有信號,所以這是你的解決方案。

在Windows上,函數是WaitForMultipleObjects()

在過去,我使用了一個全局客戶端處理線程可以用來查明他們是否需要“清理商店”然后等待他們全部完成但我也有興趣知道是否有更好的方法。 (不確定是什么語言,但在大多數情況下,您可以檢查您的線程是否仍在運行。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM