首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一种方法可以根据python中从另一个线程返回的值退出另一个线程?

是否有一种方法可以根据python中从另一个线程返回的值退出另一个线程?
EN

Stack Overflow用户
提问于 2018-01-19 08:15:50
回答 1查看 43关注 0票数 3

我有三个线程:maint1t2t1t2是从main衍生而来的。在while循环中,t2中正在进行一些处理。t2使用t1设置的bool变量。我希望控件在t2将bool变量设置为true后立即退出true循环。

代码语言:javascript
复制
class main()
    # Initialise thread object
    start t1
    start t2
    t1.join
    t2.join

t1:

代码语言:javascript
复制
flag=False;
if (condition is true):
    flag = True
    q.put(flag)
else:
    q.put(flag)
    time.sleep(1)

t2:

代码语言:javascript
复制
while (not q.get()):
    # Logic
    return

我正在检查q.get()t2中,但这并不能解决问题,因为我希望控件跳过循环中的其余行,如果假设“标志”的值被t1设置为true时,t2中的控件在t2循环中。

有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-19 09:33:32

您可以从线程中使用事件对象

您需要在主方法中设置一个事件对象,并将其用作参数:

代码语言:javascript
复制
def main()
    # Initialise thread object
    flag = threading.Event()        
    start t1  # pass flag as arg
    start t2  # pass flag as arg
    t1.join
    t2.join

你的线程逻辑应该是这样的

t1

代码语言:javascript
复制
if (condition is true):
    flag.set()

t2

代码语言:javascript
复制
while (not flag.is_set()):
    # Logic
    return

下面是另一个真实的,非伪的例子

代码语言:javascript
复制
import threading


def main():
    # Initialise thread object
    flag = threading.Event()
    for i in range(2):
        if i == 0:
            t1 = threading.Thread(target=t1_func, args=(flag,))
            t1.start()
        else:
            t2 = threading.Thread(target=t2_func, args=(flag,))
            t2.start()


def t1_func(flag):
    for i in range(100000000):
        if i == 100000000 - 1:
            flag.set()


def t2_func(flag):
    while not flag.is_set():
        print('not flag yet')
    print('GOT FLAG !')


if __name__ == '__main__':
    main()

还没有旗子 还没有旗子 还没有旗子 有旗子!

希望这是有帮助的和明确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48336715

复制
相关文章

相似问题

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