Python并发编程:探索多线程和多进程的奥秘
1.1 多线程的基础知识
- 线程:线程是操作系统能够进行独立调度和执行的基本单位,它拥有自己的堆栈空间和程序计数器,可以在进程中并发执行。
- 线程同步:线程同步是指控制多个线程之间的协作与通信,以确保共享资源的正确访问和更新,避免数据竞争和资源冲突。
- GIL锁:GIL(全局解释器锁)是Python中为了保证解释器在同一时间只执行一个线程而引入的机制,它限制了Python的多线程并行性。
1.2 多线程的创建与管理
- 创建线程:使用Python的
threading
模块可以轻松创建线程,Thread()
类提供了创建线程所需的基本功能。import threading
def task(name): print(f"Task {name} is running.")
创建线程并赋予名字
thread1 = threading.Thread(target=task, args=("Thread 1",)) # 线程1 thread2 = threading.Thread(target=task, args=("Thread 2",)) # 线程2
启动线程
thread1.start() thread2.start()
- 线程同步:使用锁(Lock)或信号量(Semaphore)等同步原语可以实现线程的协作与通信,避免数据竞争。
```python
import threading
# 定义共享变量
shared_value = 0
# Lock对象用于保护共享变量,确保原子操作
lock = threading.Lock()
def increment_shared_value():
# 使用lock对象加锁以确保原子操作
lock.acquire()
global shared_value
shared_value += 1
# 释放锁
lock.release()
# 创建多个线程并赋予任务
threads = []
for i in range(10):
thread = threading.Thread(target=increment_shared_value)
threads.append(thread)
# 启动线程
for thread in threads:
thread.start()
# 等待所有线程结束
for thread in threads:
thread.join()
# 输出最终的共享变量值
print(f"Shared value: {shared_value}") # 预期输出:10
二、多进程:释放并行计算潜能
多进程是另一种并发编程技术,它允许您在不同的进程中创建和执行多个任务。进程是独立运行的程序实体,拥有自己的地址空间、堆栈和代码段。多进程的优势在于它可以充分利用多核处理器的计算能力,实现真正的并行计算。
2.1 多进程的基础知识
- 进程:进程是操作系统能够分配独立内存空间和执行指令的基本单位,它拥有自己的地址空间、堆栈和代码段,是独立运行的程序实体。
- 进程通信:进程通信是指进程之间的数据交换和同步,以便它们能够协作和共享资源。
- 进程池:进程池是一种管理进程的机制,它预先创建并维护一定数量的进程,以供程序使用,提高创建和销毁进程的效率。
2.2 多进程的创建与管理
- 创建进程:使用Python的
multiprocessing
模块可以轻松创建进程,Process()
类提供了创建进程所需的基本功能。import multiprocessing
def task(name): print(f"Task {name} is running.")
创建进程并赋予名字
process1 = multiprocessing.Process(target=task, args=("Process 1",)) # 进程1 process2 = multiprocessing.Process(target=task, args=("Process 2",)) # 进程2
启动进程
process1.start() process2.start()
等待所有进程结束
process1.join() process2.join()
- 进程通信:Python的多进程模块提供了`Queue`、`Pipe`等通信机制,允许进程间的数据交换和同步。
```python
import multiprocessing
# 定义消息队列
queue = multiprocessing.Queue()
def producer():
# 向消息队列发送数据
for i in range(10):
queue.put(i)
def consumer():
# 从消息队列接收数据
while not queue.empty():
item = queue.get()
print(f"Received item: {item}")
# 创建进程并赋予任务
producer_process = multiprocessing.Process(target=producer)
consumer_process = multiprocessing.Process(target=consumer)
# 启动进程
producer_process.start()
consumer_process.start()
# 等待所有进程结束
producer_process.join()
consumer_process.join()
- 进程池:进程池可以提高创建和销毁进程的效率,从而减少程序的开销。
import multiprocessing
def task(name): print(f"Task {name} is running.")
创建进程池
pool = multiprocessing.Pool(4) # 4个进程
将任务添加到进程池
for i in range(10): pool.apply_async(task, args=(f"Task {i}",))
关闭进程池,等待所有任务完成
pool.close() pool.join()
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341