python 线程
时间: 2025-05-28 13:30:03 浏览: 16
### Python 多线程编程概述
Python 的多线程编程可以通过 `threading` 模块实现。尽管 Python 支持多线程,但由于全局解释器锁(Global Interpreter Lock, GIL)的存在,在 CPU 密集型任务中无法真正并行运行多个线程[^1]。不过,对于 IO 密集型任务,多线程仍然能显著提升性能。
以下是关于 Python 多线程编程的一些核心知识点:
#### 1. 基本概念
- **线程** 是操作系统中的最小调度单位,允许多个任务在同一进程中并发执行。
- **线程池** 可以通过 `concurrent.futures.ThreadPoolExecutor` 实现高效管理大量线程的任务分配[^2]。
#### 2. 线程创建方式
最简单的线程创建方式是继承 `threading.Thread` 类或者直接传递目标函数给线程对象。
```python
import threading
def worker():
"""线程要执行的工作"""
print(f"Thread {threading.current_thread().name} is running")
# 方法一:直接传入 target 函数
t1 = threading.Thread(target=worker)
t1.start()
# 方法二:继承 Thread 类
class MyThread(threading.Thread):
def run(self):
print(f"Thread {self.name} is running")
t2 = MyThread()
t2.start()
```
#### 3. 线程同步机制
当多个线程访问共享资源时,可能会引发竞态条件问题。为了避免这种情况,可以使用互斥锁(Lock)、信号量(Semaphore)或其他同步工具。
```python
from threading import Lock
lock = Lock()
shared_dict = {}
def update_shared_resource(key, value):
with lock: # 加锁保护临界区
shared_dict[key] = value
print(f"{key}: {value}")
threads = []
for i in range(5):
t = threading.Thread(target=update_shared_resource, args=(f"Key-{i}", f"Value-{i}"))
threads.append(t)
t.start()
for t in threads:
t.join() # 主线程等待子线程完成
print("Final Shared Dict:", shared_dict)
```
#### 4. 队列的应用
在多线程环境中,`queue.Queue` 提供了一种线程安全的方式来进行数据交换和通信[^3]。
```python
import queue
q = queue.Queue(maxsize=0)
def producer(name, item):
q.put(item)
print(f"{name} produced {item}")
def consumer(name):
while not q.empty():
item = q.get()
print(f"{name} consumed {item}")
q.task_done()
producer_threads = [
threading.Thread(target=producer, args=("Producer", i)) for i in range(5)
]
consumer_threads = [
threading.Thread(target=consumer, args=("Consumer",))
]
for pt in producer_threads:
pt.start()
for ct in consumer_threads:
ct.start()
for pt in producer_threads:
pt.join()
for ct in consumer_threads:
ct.join()
```
#### 5. 替代方案
如果遇到 GIL 对性能的影响,可以选择以下替代方案:
- **多进程**:利用 `multiprocessing` 模块启动独立的进程,绕开 GIL 的限制。
- **异步 I/O**:借助 `asyncio` 库实现高效的事件驱动编程模式。
---
### 总结
Python 的多线程编程虽然受到 GIL 的约束,但在适当场景下依然非常有用。合理运用线程池、锁机制以及队列等工具可以帮助开发者构建稳定可靠的并发应用程序。
阅读全文
相关推荐









