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

PySide6中使用QThread时如何避免两个不同线程的任务重叠执行

实现方案

方案1:信号链式触发(固定执行顺序首选)

利用QThread完成后自动发射的finished信号,绑定到第二个线程的start()槽,即可实现前序任务跑完自动启动下一个,全程非阻塞不会卡GUI主线程。

注意:原代码缺少「线程启动触发任务执行」的绑定逻辑,已在示例中补全

from PySide6.QtCore import QThread
from MyJobs import LongJob

job_a = LongJob()
job_b = LongJob()

thread_a = QThread()
thread_b = QThread()

job_a.moveToThread(thread_a)
job_b.moveToThread(thread_b)

# 绑定线程启动信号触发任务执行
thread_a.started.connect(job_a.run)
thread_b.started.connect(job_b.run)

# 任务执行完自动退出对应线程
job_a.finished.connect(thread_a.quit)
job_b.finished.connect(thread_b.quit)

# 线程退出后自动销毁对象避免内存泄漏
job_a.finished.connect(job_a.deleteLater)
job_b.finished.connect(job_b.deleteLater)
thread_a.finished.connect(thread_a.deleteLater)
thread_b.finished.connect(thread_b.deleteLater)

# 核心逻辑:a线程执行完成后再启动b线程
thread_a.finished.connect(thread_b.start)

# 仅需启动第一个线程,第二个会自动触发执行
thread_a.start()

如果需要调整为先执行b再执行a,只需将绑定逻辑改为thread_b.finished.connect(thread_a.start),初始启动thread_b即可。

方案2:互斥等待(任务触发顺序不固定场景)

如果两个任务没有固定先后顺序、随时可能被触发,要求任意时刻只能运行一个,可通过QMutex+QWaitCondition实现自动排队:

from PySide6.QtCore import QThread, QMutex, QWaitCondition
from MyJobs import LongJob

# 全局互斥标记
run_mutex = QMutex()
wait_cond = QWaitCondition()
is_running = False

# 封装线程安全的任务类
class SafeLongJob(LongJob):
    def run(self):
        run_mutex.lock()
        global is_running
        # 有任务在跑时进入等待
        while is_running:
            wait_cond.wait(run_mutex)
        is_running = True
        run_mutex.unlock()

        # 执行原有任务逻辑
        super().run()

        # 任务完成释放标记,唤醒等待的其他任务
        run_mutex.lock()
        is_running = False
        wait_cond.wakeOne()
        run_mutex.unlock()

# 后续创建任务使用SafeLongJob即可,两个线程可随时调用start(),会自动排队不重叠
job_a = SafeLongJob()
job_b = SafeLongJob()
# 线程绑定逻辑和方案1一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 21:54:01