簡體   English   中英

監控線程

[英]Monitoring threads

我有一個產生多個線程的應用程序。 每個線程都有相當復雜的邏輯。 有時會出現死鎖或其他問題,我想得知Thread不再處於“健康”狀態。

我想到的選擇是:

  1. 記錄和監視日志
  2. 從每個線程更新內存中的共享對象(例如,以線程ID為鍵和狀態結構的字典:確定,時間跨度,然后在單獨的線程中觀察該字典,如果線程X分鍾未更新其狀態,則表示存在某種情況出錯)

但是我感覺這不是最好的解決方案。 是否有監視線程的良好實踐? 也許線程本身可以使用時間戳更新它的全局狀態,並且進程可以訪問該信息?

在此,我將概述一些想法。

1使您的代碼更健壯

顯然,保持線程健康的最簡單方法是解決所有這些不正常的狀態,如果您陷入死鎖,請更適當地使用鎖和信號燈,調試死鎖發生的原因並找到解決這些不良情況的方法。

2代理和錯誤處理程序

與上述相關,如果您可以正確地識別這些問題而又不能解決這些問題,則可以建立一個線程可以知道其處於危險狀態的系統,並實施一個可以解決這些問題的系統。線程可以說出消息給主線程,說它處於壞狀態,然后主線程可以關閉受影響的線程,從設置的“安全狀態”啟動一個新線程,然后嘗試從那里繼續。 像Elixir這樣的基於多進程的語言都非常喜歡這種保護方式。

3記錄/輪詢

如果確實沒有辦法讓您知道發生了什么/如何進行(有時總是太難了),那么在設定的時間范圍內更新共享資源的線程就很容易實現。 每隔一分鍾讓線程更新一次浮點數,精確到自上一次更新浮點數以來的時間,讓主線程每隔幾分鍾檢查一次該浮點數((如果您的線程太忙而無法按時更新它,請留大量空間) 。 如果說5分鍾沒有更新,那么您可以肯定地確定您的線程已死鎖。 如果您希望事后能夠看到此消息,那么您也可以將這些更新消息復制到日志文件中,並使用堆棧跟蹤該時間,以查看其卡在哪里

結論

總而言之,如果您可以修復/可靠地確定何時發生錯誤/受感染狀態,則可以編寫代碼來解決這些不良狀態,如果您不能這樣做,那么下一個目標應該是達到目標去做。

暫無
暫無

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

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