2016-01-13 25 views
0

我有一個python腳本,它使用while而且繼續運行。在while循環中,我有幾個if語句。一些if語句中有一個time.sleep。在使用這一段時間後,我注意到第一個time.sleep以下的所有if語句都在等待。如何在if語句中使用time.sleep並且不停止腳本的其餘部分

是否有辦法讓第一個time.sleep以下的if語句運行,還是他們會一直等待?

我可以把所有的if語句放在最下面的time.sleep,這樣所有if語句不會被time.sleep執行。除非有另一種方法,否則我會嘗試以這種方式在飛行腳本上構建這種方法,如果可以的話。

while True: 
    temp1 = tempRead1() 

    if temp1 < 65: 
     GPIO.output(17, False) 
    else: 
     GPIO.output(17, True) 
    if temp1 > 70 and GPIO.input(17): 
     time.sleep(120) 
     GPIO.output(27, False) 
    else: 
     GPIO.output(27, True) 
    if temp1 > 72 and GPIO.input(17): 
     time.sleep(120) 
     GPIO.output(22, False) 
    else: 
     GPIO.output(22, True) 
    if temp1 > 80 and GPIO.input(17): 
     time.sleep(120) 
     GPIO.output(5, False) 
    else: 
     GPIO.output(5, True) 
    if temp1 < 55: 
     GPIO.output(6, False) 
    else: 
     GPIO.output(6, True) 

time.sleep(60) 
+4

'time.sleep'暫停您的程序。這包括你所有的代碼。如果你想同時發生多種事情(比如一部分在睡覺而另一部分在做東西),你需要考慮線程或多處理。 – BrenBarn

+1

...或者只是在while循環的頂部檢查當前時間,並使用它來決定輸出應該通過的時間。 – Marius

回答

0

從你的描述中聽起來你希望每個if/else可以同時並行執行嗎?因此,即使您重新排列語句,調用sleep也會睡眠當前線程,並且由於您的程序是單線程的,所以在繼續執行之前,執行將停止指定的時間(意味着在評估下一個if/else語句之前執行的if會休眠)。

然而,不要擔心真正的同時執行,但爲什麼不重新組織你的if/elses,只能下拉到單個sleep語句。這裏有一些shell代碼讓你開始。

if not GPIO.input(17) : 
     # not going to sleep, add relevant if checks here 
     ... 

    else: 
     # do all the if checks 
     sleep = temp1 > 72 or temp1 ..... etc 
     sleeping = [temp1 > 72, temp1 > ...] 

     if sleep: 
      time.sleep(120) 
     #ok, now drive GPIO outs 
     if sleeping[0]: 
      GPIO.output(22, False) 
     else: 
      GPIO.output(22, True) 
     ... 
0

簡單的答案是,你不能在不使用某種形式的線程代碼,你的目的在此腳本,在if...statements簡單地定義一個變量的睡眠時間,然後在循環底部,

if sleep_time != 0: 
    time.sleep(sleep_time) 
相關問題