2016-11-18 70 views
1

我知道這樣的問題已經被問到了,所以從某種意義上說,這是重複的。不過,我已經看過很多這些問題和衆多網站,但我仍然無法弄清楚如何做這個問題的標題。這是我想要完成的,更具體地說:如果發生事件,在Python中喚醒一個線程

一個線程,t_sensors,讀取傳感器的值,並且在這樣做之後,進入refresh_rate秒的睡眠時間。這可能需要幾個小時,因此在此期間可能會再次請求從傳感器讀取值。此請求來自線程t_checker,該線程檢查Firebase數據庫中的數據,並根據數據選擇是否喚醒t_sensors

def start_sensors(self): 
    # do some stuff... 
    # refreshes every refresh_rate secs 
    refresh_rate = firebase_root.get('/settings', 'refreshRate') 
    condition.wait(refresh_rate) 

def check_for_plants(self): 
    while True: 
     modded_plants = firebase_root.get('/modifiedPlants', '') 
     print(modded_plants) 
     for plant, properties in modded_plants.items(): 
      print properties['status'] 
      if properties['status'] == 'modified': 
       condition.notify() 
       print("Notified") 

condition = threading.Condition() 
t_sensors = threading.Thread(target=start_sensors, args=(condition,)) 
t_checker = threading.Thread(target=check_for_plants, args=(condition,)) 
condition.acquire() 
t_sensors.start() 
t_checker.start() 

我知道我沒有正確地使用條件,但我真的不知道我應該在哪裏開始解決問題。我真的非常感謝你的幫助。

+1

查看['waiting'](https://pypi.python.org/pypi/waiting)庫。 – erip

+1

如果t_check想要檢查,或者想繼續循環,您是否不想重置定時器? – Simon

+0

@erip好的,謝謝。我會檢查出來,並讓你知道它是如何發生的。 –

回答

0

最後,我選擇完全避免線程......我發現它們是不必要的。相反,我將refresh_rate的值從start_sensors()傳遞到check_for_plants(),然後以2秒的增量休眠直到時間到了,或者如果發生事件,則調用start_sensors()。非常感謝您的幫助!