我有一个线程,在那里我使用一个线程事件从目标函数外部控制线程。
flag = threading.event()在我的目标函数中,我有类似这样的东西:
def functionname(arguments):
flag.clear()
while not flag.wait(timeout = 0.5):
# do something. 每当我想要返回线程时,在我的主函数中,我说的是flag.set()。然后将flag设置为true,我的目标函数完成执行,线程也完成。
现在,如果我想在main函数中使用flag.wait(timeout = 5),我希望阻塞并等待5秒来执行代码的“执行某件事”部分。然而,我看到代码中的“做点什么”部分像往常一样每隔0.5秒执行一次,我的main函数被阻塞了5秒。
等待方法必须阻塞,直到标志为true或可选的超时结束。它阻塞了我的主函数,而不是目标函数。有人知道为什么会这样吗?
PS:我在main函数中定义了flag事件,并将其作为参数传递给目标函数
发布于 2016-11-10 22:59:32
多个线程可以同时等待一个事件,其中一个线程在超时之前等待的时间与其他线程的等待时间无关。如果您希望线程的等待时间从超时更改为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()https://stackoverflow.com/questions/40519559
复制相似问题