首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python线程事件

Python线程事件
EN

Stack Overflow用户
提问于 2016-11-10 11:33:28
回答 1查看 2K关注 0票数 1

我有一个线程,在那里我使用一个线程事件从目标函数外部控制线程。

代码语言:javascript
复制
flag = threading.event()

在我的目标函数中,我有类似这样的东西:

代码语言:javascript
复制
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事件,并将其作为参数传递给目标函数

EN

回答 1

Stack Overflow用户

发布于 2016-11-10 22:59:32

多个线程可以同时等待一个事件,其中一个线程在超时之前等待的时间与其他线程的等待时间无关。如果您希望线程的等待时间从超时更改为5秒,那么您需要某种方法来告诉线程更改它在.5参数中传递的值。对于共享变量来说,这似乎是一项很好的工作-线程从变量中读取超时,main可以更改该变量。

但是你把它放在哪里呢?类实例是用来保存相关数据的,所以保存事件和当前超时值的类是合理的。实际上,你可以直接使用继承来完成这项工作。请注意,在本例中,超时仅在下一个时间间隔内更改-线程在使用更新值之前等待当前等待时间。立即获得更改要困难得多,我不想混淆这件事。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40519559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档