Python线程事件

时间:2016-11-10 03:33:28

标签: python multithreading

我有一个线程,我使用线程事件来控制目标函数外部的线程。

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事件,并将其作为参数传递给目标函数

1 个答案:

答案 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()