在这篇文章中我们讨论如何在Python中使用multiprocessing
模块。
- 如何创建并启动多个进程
- 如何等待进程结束
- 如何在进程间共享数据
- 如何使用锁来防止竞争条件
- 如何使用
Queue
进行流程安全的数据/任务处理。 - 如何使用
Pool
管理多个工作进程
创建和运行进程
你可以使用multiprocessing.Process()
来创建一个进程。它有两个重要的参数:
target
: 一个可调用对象(函数),这个进程将在进程启动时被调用。args
: 函数参数。元组。
实例:
from multiprocessing import Process
import os
def square_numbers():
for i in range(1000):
result = i * i
if __name__ == "__main__":
processes = []
num_processes = os.cpu_count()
print(num_processes) # 计算机中的CPU数量
# 构造多个进程
for _ in range(num_processes):
process = Process(target=square_numbers)
processes.append(process)
# 执行进程、等待进程结束
for process in processes:
process.start()
process.join()
在进程间共享数据
既然进程不在同一个内存空间,那么它们就没有访问同一个(公开)数据的权限。
因此,它们需要特殊的共享内存对象来共享数据。
数据可以通过Value
或Array
来存储在共享内存中:
Value(type, value)
: 创建一个ctypes
对象的类型是type
。访问值使用.target
。Array(type, value)
: 创建一个ctypes
数组,其元素的类型是type
。访问值使用[]
。
任务:创建两个进程,每个进程都应该访问共享变量,并修改它(在这种情况下,只增加它重复100次)。
创建两个进程,每个进程都应该访问共享变量,并修改它(在这种情况下,只增加它重复100次)。
from multiprocessing import Process, Value, Array
import time
# 增加100次
def add_100(number):
for _ in range(100):
time.sleep(0.01)
number.value += 1
# number中每个位置增加100次
def add_100_array(numbers):
for _ in range(100):
time.sleep(0.01)
for i in range(len(numbers)):
numbers[i] += 1
if __name__ == "__main__"