You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python的getter函数中终止两个线程?

解决方案:用线程安全的标志优雅终止线程

Python线程没有提供安全的强制终止方法(比如terminate()),强制终止可能引发资源泄漏、数据不一致等问题,因此推荐使用线程安全的事件标志来控制线程退出。以下是适配需求的修改实现:

修改后的代码

import time
import threading

# 创建线程安全的事件对象,用于传递退出信号
exit_event = threading.Event()

def printer():
    # 循环条件改为监听事件状态
    while not exit_event.is_set():
        print("Message")
        # 用wait替代sleep,事件触发时可立即唤醒线程,无需等待满30秒
        exit_event.wait(30)

def getter():
    while not exit_event.is_set():
        text = str(input())
        if text == "sample_text":
            print("It's sample text")
            # 设置事件,通知所有线程退出
            exit_event.set()
            # 退出当前循环,结束getter线程
            break

thread1 = threading.Thread(target=printer)
thread1.start()
thread2 = threading.Thread(target=getter)
thread2.start()

# 主线程等待子线程完全结束后再退出
thread1.join()
thread2.join()

核心逻辑说明

  • threading.Event():这是线程间安全通信的轻量机制,is_set()用于检查退出信号是否触发,set()触发退出信号,wait(timeout)会阻塞到信号触发或超时,相比time.sleep()能让printer线程立即响应退出指令。
  • 循环控制:两个线程的循环都依赖exit_event.is_set()的状态,信号触发后,循环会在下一次检查时自然退出。
  • 主线程等待:通过join()让主线程等待子线程执行完毕,避免子线程被系统强制终止。

内容的提问来源于stack exchange,提问作者Stupid Hub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:06