目录

第二十九章:多进程

本章目标

完成本章学习后,你将能够:

创建进程

import multiprocessing
import time
 
def worker(name):
    print(f"Process {name} started")
    time.sleep(2)
    print(f"Process {name} finished")
 
if __name__ == '__main__':
    # 创建进程
    p1 = multiprocessing.Process(target=worker, args=("P1",))
    p2 = multiprocessing.Process(target=worker, args=("P2",))
 
    p1.start()
    p2.start()
 
    p1.join()
    p2.join()

进程间通信

import multiprocessing
 
# Queue
queue = multiprocessing.Queue()
 
def producer(queue):
    for i in range(5):
        queue.put(i)
 
def consumer(queue):
    while True:
        item = queue.get()
        if item is None:
            break
        print(f"Got {item}")
 
# Pipe
parent_conn, child_conn = multiprocessing.Pipe()
parent_conn.send('hello')
print(child_conn.recv())
 
# Shared memory
from multiprocessing import Value, Array
num = Value('d', 0.0)      # 共享双精度浮点数
arr = Array('i', range(10))  # 共享整数数组

进程池

from multiprocessing import Pool
import os
 
def square(n):
    return n * n
 
if __name__ == '__main__':
    with Pool(processes=4) as pool:
        # map
        results = pool.map(square, range(10))
 
        # apply_async
        result = pool.apply_async(square, (5,))
        print(result.get())
 
        # 多个任务
        multiple_results = [pool.apply_async(square, (i,)) for i in range(10)]
        print([r.get() for r in multiple_results])

本章练习

1. 实现多进程并行计算 2. 实现进程池下载器 3. 比较进程vs线程性能

下一章:第三十章:异步编程