一種超時控制的方式

2021-09-23 16:00:21 字數 1003 閱讀 8252

今天看到 這篇文章:您還有心跳嗎?超時機制分析   覺得挺有意思,有興趣的同學可以先看看他的文章,簡單記錄了下自己的乙個想法,無論好壞,權當參與討論,共同進步吧。

其實 lz 一直限制在了取系統時間耗時的問題上,所以,一直想變相的通過各種手法排除掉獲取系統時間的邏輯,比如使用「次數」來對連線實現超時控制,但其實,使用次數來表示超時控制本身就是個偽命題, 比如,在超時次數的閥值是100,如果在90次後,就一直沒有被其他執行緒使用,一直不到閥值,那怎麼去將這個連線釋放掉呢?

所以,我想到了另外一種方式解決這個問題:

首先,要明確,我認為取系統時間可以取的,但是不一定要獲取連線的這個執行緒去做這個事情,比如交給其他執行緒去做,模型可能是這樣:

1. 執行緒a 拿到連線,呼叫refresh方法

2.refresh方法中,將連線自己放到乙個佇列中,後返回。

3. 某個特殊執行緒s不停的去佇列中拿元素,並且,將拿到的元素和拿到時刻的時間記錄下,封裝好交給hash環 h, h是乙個類似hashmap的hash環,只不過頭尾相接。

4. timer執行緒t不停的去遍歷h,將超時時間大於某個閥值的連線拿掉,設定為超時連線。

不過這裡需要注意到幾個問題:

1. 考慮到connection不會無限制增多,設計成環,環並不會無限制增大,所以,可行。

2. 更仔細點,可以將connection中放乙個標誌位,標示是否正在使用,timer掃瞄時,超時間在使用狀態,或者超時間不使用的連線(標準可能不同,在被使用的,可能時間要長一點。)都可以判定為超時連線

3. 因為連線數有限,所以,執行緒s的佇列中,也不會太長(每個連線乙個位子)。

4. 通過執行緒s的接入,將去系統時間等耗時操作從連線轉移到了執行緒s中,提高s執行緒的處理速度。

5. 執行緒s或許還可以一次從佇列中取出多個元素,統一取一次系統時間,將取出來的多個元素設定為該時間,整個操作在毫秒內完成,可以用乙個時間約等於各自連線時的真正時間,降低系統時間的獲取頻率。

6……. 歡迎補充。

文章** 

併發程式設計網-ifeve.com

一種新的布局方式

通過王老師的講解,讓我認識到了自己的不足,也學到了一種新的布局方式 主要是宋老師 恐嚇 我們,說如果我們去面試,面試官如果要我們使用這種方式,我們怎麼辦,怎麼解決,我才想深入了解下的 王老師提出了兩個問題,她自己也為我們解答了,現在需要我們自己去總結,化為自己的知識。第乙個問題 為什麼會兩個內聯標籤...

換一種工作的方式

畢業5年多了,婚也結了,也想要個baby了,但是我和我拿個美麗的 太太還是隔著一段長長的鐵路,前些天晚上打 她說家裡出了很多的蟲子,一種不隻名的那種,害的嚇壞了。心裡很是難過,我想該結束這段分離的日子了。昨天和leader進行了一次商談,最後同意我改變一下工作的方式,可以長時間在home裡開發,每週...

一種很好的思考方式

思考方式 當你拿到某個 技術點 或是遇到某個什麼所謂的 技巧 甚至是工具 之後,該如何進一步展開學習思考?如下 這tm 到底是個什麼東西?正常情況下 它都被用在什麼地方?平時主要拿它來幹啥?或者說這個東西可以協助解決一些什麼樣的實際業務問題 它在 正常情況下 具體是怎麼運作的 或者說其內部大致 實現...