我有一个线程,我使用线程事件来控制目标函数外部的线程。
flag = threading.event()
在我的目标函数中,我有类似的东西:
def functionname(arguments):
flag.clear()
while not flag.wait(timeout = 0.5):
# do something.
每当我想从我的main函数中返回线程时,我会说flag.set()。然后将flag设置为true,我的目标函数完成执行并完成线程。
现在,如果我想在我的main函数中使用flag.wait(timeout = 5),我希望阻塞并等待五秒钟来执行"做一些事情"代码的一部分。但是我看到"做某事"部分代码像往常一样每0.5秒执行一次,我的主要功能被阻止五秒钟。
wait方法必须阻塞,直到标志为true或可选的超时结束。它阻止了我的主要功能而不是目标功能。任何人都可以知道为什么会这样吗?
PS:我在main函数中定义了flag事件,并将其作为参数传递给目标函数
答案 0 :(得分:1)
许多线程可以同时等待事件,并且在超时之前等待的时间与其他线程的持续时间无关。如果您希望线程的等待时间从.5更改为5秒,那么您需要一些方法来告诉线程更改它在timeout参数中传递的值。这对于共享变量来说似乎是一个好工作 - 线程从变量中读取超时,而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()