在Python中,线程(Thread)是实现并发执行的一种机制。它允许程序在执行过程中同时运行多个任务。虽然Python有一个全局解释器锁(GIL, Global Interpreter Lock),这限制了多线程在执行CPU密集型任务时的并行性,但在I/O密集型任务(如网络请求、文件操作等)中,多线程仍然可以显著提高程序的效率和响应速度。
个人初理解:
首先,什么是线程,线程到底有什么用呢?
在我的首次学习中,我认为,所有的东西都属于线程
线程是计算机中CPU进行任务调度的最小单位。线程属于进程的一部分,线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
在下面会使用Threding模块创建出线程,当然,在python强大的库中Queru、thred等也可创建线程
线程的基本概念
- 线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
- 进程:是系统进行资源分配和调度的一个独立单元。每个进程都有自己的内存空间和系统资源。
Python中的线程
Python标准库提供了threading
模块来支持线程的创建和管理。
1. 创建线程
使用threading.Thread
类可以创建线程。你需要定义一个目标函数(即线程执行的任务),然后创建Thread
类的实例,将目标函数作为参数传递给实例。
import threading
def my_function():
print("Hello from my_function")
# 创建线程
thread = threading.Thread(target=my_function)
# 启动线程
thread.start()
# 主线程继续执行,不会等待上面的线程完成
print("Main thread is continuing...")
2. 线程同步
由于多线程环境下,多个线程可能同时访问共享资源,这可能导致数据竞争和不一致的状态。因此,Python提供了多种同步机制来协调线程之间的执行,比如锁(Lock)、事件(Event)、条件变量(Condition)和信号量(Semaphore)等。
import threading
lock = threading.Lock()
def critical_section():
global count
with lock:
count += 1
print(f"Count: {count}")
count = 0
threads = []
for _ in range(10):
t = threading.Thread(target=critical_section)
threads.append(t)
t.start()
for t in threads:
t.join() # 等待所有线程完成
3. 守护线程(Daemon Threads)
守护线程是主线程结束时自动退出的线程。默认情况下,线程不是守护线程。要设置守护线程,需要在启动线程之前将线程的daemon
属性设置为True
。
import threading
import time
def daemon_thread_function():
while True:
time.sleep(1)
print("Daemon thread is running")
# 创建一个守护线程
daemon_thread = threading.Thread(target=daemon_thread_function)
daemon_thread.daemon = True
daemon_thread.start()
print("Main thread exiting...")
在上面的例子中,主线程将退出,不会等待守护线程完成。
注意事项
- 由于GIL的存在,Python中的多线程并不适合用于CPU密集型任务。对于这类任务,应该考虑使用多进程(multiprocessing)或其他并发模型。
- 对于I/O密集型任务,多线程可以显著提高程序性能。
- 线程同步是避免数据竞争和保证程序正确性的重要手段,但过度使用同步机制也可能导致性能下降。
- 守护线程在主线程退出时会自动退出,因此不能用于需要长时间运行的任务。