Python基础之threading多线程同时运行程序
threading多线程同时运行程序
目录
- threading多线程同时运行程序
- 1 threading
- 1.1 概念
- 1.2 主要组件
- 1.3 注意事项
- 1.4 基本语法
- 2 代码测试
- 2.1 分别开启线程
- 2.2 线程连续启动
1 threading
1.1 概念
Python 的 threading 库用于实现多线程编程,允许程序在同一时间执行多个任务。threading 库提供了丰富的多线程编程工具,适合处理 I/O 密集型任务或需要并发执行的场景。对于 CPU 密集型任务,多线程可能不会提升性能,建议使用 multiprocessing 模块,以避免 GIL(全局解释器锁)的限制。
1.2 主要组件
- Thread 类:用于创建和管理线程。通过继承 Thread 类或直接实例化并传入目标函数来创建线程。
- Lock 类:提供线程同步机制,防止多个线程同时访问共享资源。
- RLock 类:可重入锁,允许同一线程多次获取锁。
- Condition 类:用于线程间的条件同步,允许线程等待特定条件满足。
- Semaphore 类:限制同时访问共享资源的线程数量。
- Event 类:用于线程间的事件通知,一个线程可以等待事件,另一个线程可以触发事件。
- Timer 类:用于在指定时间后执行函数。
- Barrier 类:用于同步多个线程,确保它们在某个点同时继续执行。
1.3 注意事项
- GIL(全局解释器锁): Python 的 GIL 限制了同一时间只有一个线程执行 Python 字节码,因此在 CPU 密集型任务中,多线程可能不会提升性能。
- 线程安全: 多线程编程需注意线程安全问题,避免竞争条件。
- 调试: 多线程程序调试较为复杂,需使用适当的工具和方法。
1.4 基本语法
- thread = threading.Thread(target=worker,args=(‘work1’,)),创建线程
- target=worker,指定线程worker,worker为def的函数名
- args=(‘work1’,),worker函数所用到的参数,无可不写
- thread .start(),启动线程
- thread .join(), 等待线程完成
2 代码测试
2.1 分别开启线程
每次线程的开启,线程和主线顺序可能都不同
代码展示:
import threading
def worker():
print('开始')
for i in range(5):
print(f'正在worker:{i}')
print('完成')
thread = threading.Thread(target=worker)
thread.start()
print('开始主线')
def worker1(n):
print(f'{n}开始')
for i in range(5):
print(f'{n}正在{i}')
print('完成')
thread1 = threading.Thread(target=worker1,args=('work1',))
thread1.start()
print('继续主线')
运行结果:
2.2 线程连续启动
可以明显看到时间的停顿,顺序不同。
代码展示:
import threading
import time
def run(n):
print('task',n)
time.sleep(1)
print('2s')
time.sleep(1)
print('1s')
time.sleep(1)
print('0s')
time.sleep(1)
def run2(t):
time.sleep(t)
print(f'wait {t}s')
if __name__ =='__main__':
t1 = threading.Thread(target=run,args=('t1',))
t2 = threading.Thread(target=run, args=('t1',))
t1.start()
t2.start()
t3 = threading.Thread(target=run2, args=(5,))
t4 = threading.Thread(target=run2, args=(8,))
t3.start()
time.sleep(10)
print('开始计时')
t4.start()
运行结果: