普通多线程:
import threading
import time
def run(n):
print(f"我是{n}的子线程1") # 子线程1
time.sleep(1)
print(f"我是{n}的子线程2") # 子线程2
time.sleep(1)
print(f"我是{n}的子线程3") # 子线程3
time.sleep(1)
print(f"我是{n}的子线程4") # 子线程4
time.sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=run, args=("t1",)) # 创建t1主线程 执行run函数
t2 = threading.Thread(target=run, args=("t2",)) # 创建t2主线程 执行run函数
t1.start() # 启动t1线程
t2.start() # 启动t2线程
#2023.1.10 自学笔记
执行结果:
执行两次,结果不一致
这是由于并发的两个不同线程间,子线程执行时间冲突时cpu自由调度子线程,导致的子线程执行顺序发生变化
# 执行两次结果对比
#第一次结果 #第二次结果
# 我是t1的子线程1 # 我是t1的子线程1
# 我是t2的子线程1 # 我是t2的子线程1
# 我是t2的子线程2 # 我是t1的子线程2
# 我是t1的子线程2 # 我是t2的子线程2
# 我是t1的子线程3 # 我是t1的子线程3
# 我是t2的子线程3 # 我是t2的子线程3
# 我是t2的子线程4 # 我是t1的子线程4
# 我是t1的子线程4 # 我是t2的子线程4
调整start位置:
t1 = threading.Thread(target=run, args=("t1",))
t1.start() # 启动t1线程
t2 = threading.Thread(target=run, args=("t2",))
t2.start() # 启动t2线程
执行结果:
执行两次,结果一直
这是由于并发的两个线程启动时,出现时差,子线程间没有发生时间冲突
# 我是t1的子线程1
# 我是t2的子线程1
# 我是t1的子线程2
# 我是t2的子线程2
# 我是t1的子线程3
# 我是t2的子线程3
# 我是t1的子线程4
# 我是t2的子线程4
自定义多线程
import threading
import time
class MyThread(threading.Thread):
def __init__(self, n):
super(MyThread, self).__init__() # 重构run函数必须要写
self.n = n
def run(self):
print(f"我是{self.n}的子线程1")
time.sleep(1)
print(f"我是{self.n}的子线程2")
time.sleep(1)
print(f"我是{self.n}的子线程3")
time.sleep(1)
print(f"我是{self.n}的子线程4")
time.sleep(1)
if __name__ == "__main__":
t1 = MyThread("t1")
t2 = MyThread("t2")
t1.start()
t2.start()
#2023.1.10 自学笔记
执行结果:
执行两次,结果不一致
原因同上
# 执行两次结果对比
#第一次结果 #第二次结果
# 我是t1的子线程1 # 我是t1的子线程1
# 我是t2的子线程1 # 我是t2的子线程1
# 我是t2的子线程2 # 我是t1的子线程2
# 我是t1的子线程2 # 我是t2的子线程2
# 我是t1的子线程3 # 我是t1的子线程3
# 我是t2的子线程3 # 我是t2的子线程3
# 我是t2的子线程4 # 我是t1的子线程4
# 我是t1的子线程4 # 我是t2的子线程4
调整start位置:
t1 = MyThread("t1")
t1.start()
t2 = MyThread("t2")
t2.start()
执行结果:
执行两次,结果一致
原因同上
# 我是t1的子线程1
# 我是t2的子线程1
# 我是t1的子线程2
# 我是t2的子线程2
# 我是t1的子线程3
# 我是t2的子线程3
# 我是t1的子线程4
# 我是t2的子线程4