2016-11-10 63 views
0

我有一個線程,在這裏我使用一個線程事件,以控制從目標函數外螺紋。Python的線程事件

flag = threading.event() 

在我的目標函數,我有這樣的事情:

def functionname(arguments): 
    flag.clear() 
    while not flag.wait(timeout = 0.5): 
     # do something. 

,每當我想要回線,從我的主要功能我說,flag.set()。然後將標誌設置爲true,我的目標函數完成執行並且線程完成。

現在,如果我想在我的主函數中使用flag.wait(超時= 5),我期待阻塞等待五秒執行代碼的「有所作爲」的一部分。但是我發現代碼中的「執行某些操作」部分每隔0.5秒執行一次,並且我的主要功能被阻止了五秒鐘。

等待方法有可能阻塞,直到該標誌爲真,或者可選的超時結束。它阻止了我的主要功能,而不是目標功能。任何人都知道這可能是爲什麼?

PS:我在主函數中定義的標誌事件,並通過它作爲參數傳遞給目標函數

+0

我很困惑....你'flag.wait(超時= 5)',你想,爲了使線程的'flag.wait(超時= 0.5)'等待5秒鐘,而不是?這是行不通的。主線程的超時是獨立於孩子的。你的目標是什麼?你想控制孩子在主線程中等待多久? – tdelaney

+0

的flag.wait(超時= 0.5)最初寫入時,我希望目標函數以每0.5秒處運行。現在,如果我想將其更改爲5秒,則使用flag.wait(5)。標誌是一個線程事件,它應該只對目標函數執行,而不是對主線程執行。 –

回答

0

許多線程可以在同一時間對事件等待一個等待多久之前超時是獨立的其他人做多久。如果你想你的線程的等待時間.5至5秒改變,那麼你就需要一些方法來告訴線程改變它通過在超時參數的值。這似乎是一個共享變量的好工作 - 線程從變量中讀取超時,並且main可以更改該變量。

但是,你在哪裏把它?那麼,存在類實例來保存關聯的數據,因此持有該事件的類和當前的超時值是合理的。事實上,你可以使用繼承來完成這項工作。注意在這個例子中,超時只會在下一個時間間隔中改變 - 線程在使用更新後的值之前會等待當前的等待時間。立即獲得變更顯然更加困難,我不想混淆這個問題。

import threading 
import time 

class VariablyTimedEvent(threading.Event): 

    def __init__(self, initial_timeout=None): 
     super().__init__() 
     self.timeout = initial_timeout 

    def wait(self): 
     return super().wait(timeout=self.timeout) 

# ------------- test ----------------- 

def functionname(event): 
    event.clear() 
    while not event.wait(): 
     do_something() 
    print('event set, exiting') 

_do_something_start = time.time() 
def do_something(): 
    # a mock object that shows time since program start 
    print('%03.1f: do something' % (time.time() - _do_something_start)) 

print("start timing at .5 second") 
event = VariablyTimedEvent(.5) 
thread = threading.Thread(target=functionname, args=(event,)) 
thread.start() 
time.sleep(3.1) 
print("change timeout to 2 seconds") 
event.timeout = 2 
time.sleep(7) 
print("exit the thread") 
event.set() 
thread.join()