在计算密集型任务中,利用多核处理器进行并行计算是提高程序效率的关键。Python的multiprocessing模块为我们提供了强大而简单的多进程操作工具,让我们一起来探索其魔力吧。

创建并启动子进程

通过multiprocessing模块,我们可以轻松地创建并启动子进程。以下是一个简单的使用范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import multiprocessing
import os


def worker():
print("子进程(Process:{})开始执行...父进程为(Process:{})".format(os.getpid(), os.getppid()))


if __name__ == "__main__":
print("主进程(Process:{})开始执行...".format(os.getpid()))
process = multiprocessing.Process(target=worker)
process.start()
process.join()

在上述示例中,我们使用multiprocessing.Process类创建了一个子进程,并指定了其执行的函数。通过start()方法启动子进程,并通过join()方法等待子进程执行完毕。

进程间通信

多个进程之间的数据交换和通信是一项关键任务。multiprocessing模块提供了多种机制来实现进程间通信,比如队列(Queue)、管道(Pipe)等。以下是一个使用队列进行进程间通信的范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import multiprocessing
import random
import time


def producer(_queue):
for i in range(5):
time.sleep(round(random.random() * 5))
_queue.put(i)
print("生产了数据:", i)


def consumer(_queue):
while True:
time.sleep(round(random.random() * 3))
data = _queue.get()
if data is None:
break
print("消费了数据:", data)


if __name__ == "__main__":
queue = multiprocessing.Queue()
process1 = multiprocessing.Process(target=producer, args=(queue,))
process2 = multiprocessing.Process(target=consumer, args=(queue,))
process1.start()
process2.start()
process1.join()
process2.join()

在上述示例中,我们通过multiprocessing.Queue创建了一个队列,用于在生产者进程和消费者进程之间传递数据。生产者进程通过put()方法向队列中放入数据,消费者进程通过get()方法从队列中获取数据。

并行计算

multiprocessing模块使得并行计算变得轻而易举。以下是一个简单的并行计算范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import multiprocessing
import time


def find_primes_within_n(n):
primes = [] # 用于存放素数的列表
is_prime = [True] * (n + 1) # 初始化标记数组,初始时所有数都认为是素数
is_prime[0], is_prime[1] = False, False # 0和1不是素数
for num in range(2, n + 1): # 遍历2到n的所有数
if is_prime[num]: # 如果当前数是素数
primes.append(num) # 将其加入素数列表
# 将当前素数的倍数标记为非素数
for multiple in range(num * num, n + 1, num):
is_prime[multiple] = False
return primes


if __name__ == "__main__":
numbers = [12213651] * 10
print(numbers)
start_time = time.time()
result = []
for number in numbers:
result.append(find_primes_within_n(number))
end_time = time.time()
print("单进程运行时间", end_time - start_time, "seconds")
start_time = time.time()
pool = multiprocessing.Pool()
results = pool.map(find_primes_within_n, numbers)
pool.close()
pool.join()
end_time = time.time()
print("多进程运行时间", end_time - start_time, "seconds")

在上面的示例中,我们通过multiprocessing.Pool创建了一个进程池,并使用map()方法将任务分配给不同的子进程进行并行计算,最终得到了计算结果。

通过multiprocessing模块,我们可以更好地利用计算资源,加速程序的执行。让我们一起探索并发编程的奇妙世界,释放Python潜能,提升程序的计算效率。