簡體   English   中英

可中斷睡眠?

[英]Interruptable Sleep?

我目前正在構建一個 python 應用程序,它應該在用戶輸入的給定時間戳(不是按時間順序輸入)觸發函數。
我遇到了一個問題,因為我不希望我的程序忙於檢查是否輸入了必須添加到計時器隊列中的新時間戳,但也不希望在每次出現新時間戳時都創建一大堆線程創建的唯一目的是等待該時間戳。
我想到的是將它們放在一個線程中並做一些類似可中斷睡眠的事情,但除此之外我想不出另一種方式:

while timer_not_depleted:
      sleep(1)
      if something_happened:
          break

這基本上是忙等待。 那么有什么關於實現可中斷睡眠的建議嗎?

我想建議select

調用它的超時等於最近事件的延遲(堆隊列是維護未來時間戳隊列的良好數據結構)並提供一個套接字(作為rlist arg 中的一個項目),您的程序在其中偵聽更新來自用戶。

當套接字有傳入數據或發生超時時, select調用返回。

您使用線程的直覺是正確的。 以下 master-worker 結構可以工作:

  • 主線程產生一個等待“作業”的工作線程;
  • 兩個線程共享一個Queue ——每當需要調度新作業時,主線程put作業規范放入隊列;
  • 同時,工作線程執行以下操作:
    • 維護一個單獨的未來要運行的作業列表,並跟蹤在下一個作業運行之前保持休眠的時間;
    • 通過調用Queue.get(block=True, timeout=<time-to-next-job>)繼續偵聽新作業;
    • 在這種情況下,如果在超時之前沒有安排新的作業, Queue.get將引發Empty異常 - 此時工作線程應該運行已調度的函數並返回輪詢。 如果一個新的作業在此期間預定, Queue.get返回新的工作,這樣你可以更新timeout值,然后回到等待。

暫無
暫無

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

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