對於我的項目的某些部分,我需要一個流程本地調度系統,它允許我在幾秒鐘內延遲方法執行。我有成千上萬的這個系統的「客戶端」,所以每個延遲使用threading.Timer
是一個壞主意,因爲我會很快達到操作系統線程限制。我的implemented系統只使用一個線程進行時序控制。Python中的快速方法調用調度
主要想法是保持排序的任務(時間+ func + args + kwargs)隊列,並使用單個threading.Timer
來調度/取消該隊列頭部的執行。這個方案很有效,但我對錶演不滿意。 〜大約2000個客戶端每10秒計劃虛擬任務會導致進程花費40%的CPU時間。縱觀剖析器輸出,我發現所有時間都花在新的構建,開始,特別是創建新線程上。
我相信還有更好的辦法。現在我考慮重寫LightTimer
,以便將有一個執行線程可由threading.Event
控制,並有多個定時線程可用於事件。例如:
- 我在10秒內安排了一個任務調用。該任務被添加到隊列中。計時線程#1在
event.set()
- 之前開始
time.sleep(10)
然後我安排一個任務在11秒內打電話。該任務被添加到隊列中。計時線程沒有任何反應,它會在醒來後注意到新的任務。 - 然後我安排一個任務在5秒內致電。該任務被添加到隊列中。定時線程#2開始
time.sleep(5)
,因爲#1已經睡了一段較長的時間間隔。
我希望你已經發現了這個想法。你怎麼看待這種方式?有沒有更好的辦法?也許我可以利用一些linux系統功能來制定最佳解決方案?
嗯......非常有趣,謝謝!特別是我從來沒有看過'heapq',也沒有考慮過使用'threading.Condition'來達到這個目的。 – nkrkv 2010-06-07 15:49:25