Python3多线程执行顺序控制与线程基础解析
本文深入探讨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多线程执行顺序的探讨即为全部内容,希望能提供参考,欢迎支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













