Python并发编程:多线程和多进程,解锁并行计算的威力
发布时间: 2024-06-20 19:15:38 阅读量: 72 订阅数: 34
Python并发:多线程与多进程
![Python并发编程:多线程和多进程,解锁并行计算的威力](https://img-blog.csdnimg.cn/71ea967735da4956996eb8dcc7586f68.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAa2Fua2FuXzIwMjEwNA==,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. Python并发编程概述
Python并发编程是一种编程范式,它允许一个程序同时执行多个任务。它通过使用线程和进程来实现,它们是操作系统提供的并发原语。
**线程**是程序执行的轻量级单元,它与其他线程共享相同的内存空间。线程可以同时运行,从而提高程序的效率。
**进程**是程序执行的独立单元,它拥有自己的内存空间。进程可以同时运行,但它们比线程开销更大。
# 2. Python多线程编程
### 2.1 多线程基础
#### 2.1.1 线程概念和创建
**线程概念:**
线程是计算机程序中一个独立的执行单元,它与其他线程共享相同的内存空间和资源,但拥有自己的程序计数器和栈。
**线程创建:**
在 Python 中,可以通过 `threading` 模块创建线程:
```python
import threading
def thread_function():
# 线程要执行的任务
# 创建线程
thread = threading.Thread(target=thread_function)
# 启动线程
thread.start()
```
#### 2.1.2 线程同步和通信
**线程同步:**
当多个线程同时访问共享资源时,需要进行同步以避免数据竞争。Python 中常用的同步机制有:
* **锁(Lock):** 确保同一时刻只有一个线程可以访问共享资源。
* **条件变量(Condition):** 允许线程等待特定条件满足后再继续执行。
* **信号量(Semaphore):** 限制同时访问共享资源的线程数量。
**线程通信:**
线程之间可以共享数据和事件,常用的通信机制有:
* **队列(Queue):** 线程之间传递消息或数据的 FIFO 队列。
* **管道(Pipe):** 线程之间进行双向通信的管道。
* **事件(Event):** 用于通知线程发生特定事件。
### 2.2 多线程高级应用
#### 2.2.1 线程池和队列
**线程池:**
线程池是一个预先创建的线程集合,当需要执行任务时,可以从线程池中获取一个线程来执行任务。这可以提高性能,避免频繁创建和销毁线程。
**队列:**
队列用于在多个线程之间传递任务或数据。线程池可以与队列配合使用,将任务放入队列,然后由线程池中的线程从队列中获取任务并执行。
#### 2.2.2 并发锁和条件变量
**并发锁:**
并发锁用于确保同一时刻只有一个线程可以访问共享资源。Python 中常用的并发锁类型有:
* **互斥锁(Mutex):** 最基本的并发锁,保证同一时刻只有一个线程可以获取锁。
* **读写锁(RLock):** 允许多个线程同时读取共享资源,但只能有一个线程同时写入共享资源。
**条件变量:**
条件变量用于线程等待特定条件满足后再继续执行。线程可以等待条件变量,当条件满足时,线程将被唤醒并继续执行。
**示例:**
```python
import threading
# 创建一个共享变量
shared_variable = 0
# 创建一个互斥锁
lock = threading.Lock()
def increment_shared_variable():
# 获取锁
lock.acquire()
try:
# 访问共享变量
global shared_variable
shared_variable += 1
finally:
# 释放锁
lock.release()
# 创建多个线程并执行任务
threads = []
for i in range(10):
thread = threading.Thread(target=increment_shared_variable)
threads.append(thread)
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
# 输出共享变量的值
print(shared_variable) # 输出:10
```
# 3.1 多进程基础
#### 3.1.1 进程概念和创建
**进程概念**
进程是操作系统中正在运行的程序实例。它是一个独立的执行单元,拥有自己的内存空间、资源和执行流。与线程不同,进程是操作系统管理的基本单位,而线程是进程内部的执行单元。
**进程创建**
在 Python 中,可以使用 `multiprocessing` 模块创建进程。该模块提供了 `Process` 类,用于表示进程。要创建进程,可以使用以下代码:
```python
import multiprocessing
def worker(num):
print(f"Worker {num} is running")
if __name__ == "__main__":
# 创建一个进程
process = multiprocessing.Process(target=worker, args=(1,))
# 启动进程
process.start()
# 等待进程结束
process.join()
```
在上面的代码中,`worker` 函数是进程的入口点。`target` 参数指定要运行的函数,`args` 参数指定传递给函数的参数。`start()` 方法启动进程,`join()` 方法等待进程结束。
#### 3.1.2 进程间通信
进程之间需要通信才能协作。Python 中的进程间通信方式包括:
* **管道(Pipes):**管道是一种单向通信机制,允许一个进程向另一个进程写入数据。
* **队列(Queues):**队列是一种多向通信机制,允许多个进程写入和读取数据。
* **共享内存(Shared Memory):**共享内存允许多个进程访问同一块内存区域。
* **信号量(Semaphores):**信号量是一种同步机制,用于协调对共享资源的访问。
**管道示例**
```python
import multiprocessing
def reader(pipe):
while True:
data = pipe.recv()
if data == "STOP":
break
print(f"Received data: {data}")
d
```
0
0