Python3多线程执行顺序控制与线程基础解析

洛溪
洛溪
发布时间:2026-10-14| 3人浏览过
原创

本文深入探讨Python3中多线程的执行顺序问题,通过具体案例展示如何利用Lock锁机制控制线程ABC按序打印。同时解析threading.Thread类的run方法重写及线程启动原理,阐明多线程程序执行顺序的不确定性及其影响因素,帮助开发者掌握线程同步与调度的核心技巧。

多线程顺序打印问题描述

题目要求定义三个线程,ID分别为A、B、C,每个线程需打印自身ID 10次,并严格遵循ABCABC……的顺序进行输出。

Lock锁控制线程顺序实现方案

具体实现方案如下:


from threading import Thread, Lock


# 由_acquire解锁执行后释放_release锁
def _print(_id: str, _acquire: Lock, _release: Lock) -> None:
  for i in range(10):
    _acquire.acquire()
    print(f"id:{_id}")
    _release.release()


if __name__ == '__main__':
  # 创建三个锁供3个线程使用
  mutex1 = Lock()
  mutex2 = Lock()
  mutex3 = Lock()
  # 定义三个线程A、B、C
  # 线程A需要mutex1解锁执行后释放mutex2
  # 线程B需要mutex2解锁执行后释放mutex3
  # 线程C需要mutex3解锁执行后释放mutex1
  # 元组中第一位是自定义的线程ID,第二位是解锁需要的锁,第三位是释放的锁
  threads = [Thread(target=_print, args=[i[0], i[1], i[2]]) for i in
        [('A', mutex1, mutex2), ('B', mutex2, mutex3), ('C', mutex3, mutex1)]]
  # 把mutex2和mutex3这两把锁先用了以便阻塞线程2和线程3的执行
  mutex2.acquire()
  mutex3.acquire()
  # 接下来只有线程A可以先执行是因为mutex1并没有被占用
  # 线程B和线程C需要分别等待着锁2和锁3的释放才能继续执行
  [thr.start() for thr in threads]
  [thr.join() for thr in threads]

Python线程封装与执行机制解析

补充知识点:Python线程代码封装与执行流程解析

线程使用核心注意事项

线程使用注意事项

1. 线程执行代码的封装方式

前文已介绍利用threading模块开发多任务程序。为提升线程封装性,通常建议定义继承自threading.Thread的新类,并重写其run方法。

代码示例如下:


#coding=utf-8
import threading
import time

class MyThread(threading.Thread):
  def run(self):
    for i in range(3):
      time.sleep(1)
      msg = "I'm "+self.name+' @ '+str(i) #name属性中保存的是当前线程的名字
      print(msg)


if __name__ == '__main__':
  t = MyThread()
  t.start()

关键说明

Python的threading.Thread类包含一个run方法,用于定义线程的具体功能。用户可在自定义线程类中覆盖此方法。创建线程实例后,调用Thread类的start方法即可启动线程,交由Python虚拟机调度。当线程获得执行权时,将自动调用run方法执行任务。

多线程执行顺序的不确定性分析

2. 线程执行顺序分析


#coding=utf-8
import threading
import time

class MyThread(threading.Thread):
  def run(self):
    for i in range(3):
      time.sleep(1)
      msg = "I'm "+self.name+' @ '+str(i)
      print(msg)
def test():
  for i in range(5):
    t = MyThread()
    t.start()
if __name__ == '__main__':
  test()

运行结果:(具体输出可能因系统调度而异,但整体规律一致)


  I'm Thread-1 @ 0
  I'm Thread-2 @ 0
  I'm Thread-5 @ 0
  I'm Thread-3 @ 0
  I'm Thread-4 @ 0
  I'm Thread-3 @ 1
  I'm Thread-4 @ 1
  I'm Thread-5 @ 1
  I'm Thread-1 @ 1
  I'm Thread-2 @ 1
  I'm Thread-4 @ 2
  I'm Thread-5 @ 2
  I'm Thread-2 @ 2
  I'm Thread-1 @ 2
  I'm Thread-3 @ 2

结果说明

通过代码与运行结果可见,多线程程序的执行顺序具有不确定性。当执行到sleep语句时,线程进入阻塞(Blocked)状态;sleep结束后,线程转为就绪(Runnable)状态并等待调度。调度器会随机选择一个就绪线程执行。上述代码仅能保证每个线程完整运行run函数,但无法确定线程启动顺序及run函数内每次循环的执行先后。

线程生命周期与调度总结

3. 总结要点

每个线程默认拥有名称,即使示例中未显式指定,Python也会自动为线程分配名称。

当线程的run()方法执行完毕时,该线程即告结束。

虽然无法直接控制线程调度程序,但可通过其他机制间接影响线程调度行为。

以上关于Python3多线程执行顺序的探讨即为全部内容,希望能提供参考,欢迎支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。