24-1-Python多线程—多线程基础(python多线程有什么用)
1-1-什么是线程
- 线程是操作系统能够进行运算调度的最小单位。
- 它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程会共享进程的资源,例如内存空间、文件描述符等。
- 线程拥有自己的栈空间、程序计数器等少量的私有数据。
- 线程的创建和销毁开销相对较小,切换速度也比较快,适合用于处理一些轻量级的任务,像同时处理多个用户请求等。
1-2-什么是进程
- 进程是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。
- 每个进程都有自己独立的内存空间、系统资源(如文件句柄、网络连接等)以及程序计数器等。
- 进程之间相互独立,一个进程的崩溃通常不会影响到其他进程。进程的创建和销毁开销相对较大,因为需要分配和释放大量的系统资源。
1-3-线程和进程的关系
包含关系
一个进程可以包含多个线程,这些线程在进程的上下文环境中运行,共享进程的资源。
资源共享
线程共享进程的内存空间、文件描述符等资源,但每个线程有自己独立的栈空间和程序计数器。而进程之间的资源是相互独立的。
调度和执行
操作系统以进程为单位进行资源分配,以线程为单位进行CPU调度。
开销
线程的创建和销毁开销较小,切换速度快;进程的创建和销毁开销大,切换速度慢。
1-4-什么是多线程环境
- 多线程环境指的是在一个程序中同时存在多个线程并发执行的情况。
- 在多线程环境下,多个线程可以同时处理不同的任务,从而提高程序的执行效率。
- 例如,在一个图形界面程序中,可以使用一个线程负责处理用户的输入,另一个线程负责更新界面显示,这样可以避免因为一个任务的阻塞而导致整个程序无响应。
1-5-多线程环境的解决
在多线程环境中,会面临一些问题,如线程安全问题、死锁问题等,以下是一些常见问题及解决方法:
1-5-1-线程安全问题
当多个线程同时访问共享资源时,可能会导致数据不一致的问题。
1-5-1-1-解决方法
互斥锁(`threading.Lock`)
通过对共享资源加锁,同一时间只允许一个线程访问该资源。
import threading
# 创建一个锁对象
lock = threading.Lock()
shared_variable = 0
def increment():
global shared_variable
for _ in range(100000):
# 获取锁
lock.acquire()
try:
shared_variable += 1
finally:
# 释放锁
lock.release()
threads = []
for _ in range(2):
t = threading.Thread(target=increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"Final value of shared_variable: {shared_variable}")
信号量(`threading.Semaphore`)
可以控制同时访问共享资源的线程数量。
条件变量(`threading.Condition`)
用于线程之间的同步,一个线程等待某个条件满足后再继续执行。
1-5-2-死锁问题
死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。解决方法有:
- 避免锁的嵌套:尽量避免一个线程同时持有多个锁,减少死锁的可能性。
- 使用超时机制:在获取锁时设置一个超时时间,如果在规定时间内无法获取到锁,则放弃操作。
- 按顺序获取锁:所有线程都按照相同的顺序获取锁,避免循环等待。