全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-19 8 分钟 ✍️ juanwangdev

Python 进程基础

multiprocessing 模块实现多进程编程,每个进程有独立内存空间。

创建进程

Python
import multiprocessing
import time

def worker(name):
    print(f"进程 {name} 开始,PID: {multiprocessing.current_process().pid}")
    time.sleep(2)
    print(f"进程 {name} 结束")

# 方式一:函数创建
p = multiprocessing.Process(target=worker, args=('A',))
p.start()
p.join()

# 方式二:类继承
class MyProcess(multiprocessing.Process):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(f"进程 {self.name} 运行")

p2 = MyProcess('B')
p2.start()
p2.join()

进程属性

Python
import multiprocessing
import time

def task():
    time.sleep(3)

p = multiprocessing.Process(target=task)

print(p.name)       # Process-1
print(p.pid)        # None(启动前)
print(p.is_alive()) # False

p.start()

print(p.pid)        # 进程ID(数字)
print(p.is_alive()) # True

p.join()
print(p.is_alive()) # False

进程间通信 Queue

Python
import multiprocessing

def producer(q):
    for i in range(5):
        q.put(i)
        print(f"生产: {i}")

def consumer(q):
    while True:
        item = q.get()
        print(f"消费: {item}")
        if item == 4:
            break

q = multiprocessing.Queue()

p1 = multiprocessing.Process(target=producer, args=(q,))
p2 = multiprocessing.Process(target=consumer, args=(q,))

p1.start()
p2.start()

p1.join()
p2.join()

进程间通信 Pipe

Python
import multiprocessing

def sender(conn):
    conn.send('Hello from sender')
    conn.close()

def receiver(conn):
    msg = conn.recv()
    print(f"收到: {msg}")
    conn.close()

# 创建管道,返回两个连接对象
parent_conn, child_conn = multiprocessing.Pipe()

p1 = multiprocessing.Process(target=sender, args=(child_conn,))
p2 = multiprocessing.Process(target=receiver, args=(parent_conn,))

p1.start()
p2.start()

p1.join()
p2.join()

共享内存 Value 和 Array

Python
import multiprocessing

def increment(counter):
    for _ in range(1000):
        counter.value += 1

# 共享整数
counter = multiprocessing.Value('i', 0)  # 'i' = 整数类型

processes = [multiprocessing.Process(target=increment, args=(counter,))
             for _ in range(10)]

for p in processes:
    p.start()
for p in processes:
    p.join()

print(counter.value)  # 结果可能不等于 10000(需要加锁)

# 使用锁
def safe_increment(counter, lock):
    for _ in range(1000):
        with lock:
            counter.value += 1

lock = multiprocessing.Lock()
counter = multiprocessing.Value('i', 0)

processes = [multiprocessing.Process(target=safe_increment, args=(counter, lock))
             for _ in range(10)]

for p in processes:
    p.start()
for p in processes:
    p.join()

print(counter.value)  # 10000(正确)

共享数组

Python
import multiprocessing

def modify_array(arr):
    for i in range(len(arr)):
        arr[i] = arr[i] * 2

# 共享数组
arr = multiprocessing.Array('i', [1, 2, 3, 4, 5])

p = multiprocessing.Process(target=modify_array, args=(arr,))
p.start()
p.join()

print(list(arr))  # [2, 4, 6, 8, 10]

Manager 共享对象

Python
import multiprocessing

def modify_dict(d, lst):
    d['key'] = 'value'
    lst.append(123)

with multiprocessing.Manager() as manager:
    shared_dict = manager.dict()
    shared_list = manager.list()

    p = multiprocessing.Process(target=modify_dict, args=(shared_dict, shared_list))
    p.start()
    p.join()

    print(shared_dict)  # {'key': 'value'}
    print(shared_list)  # [123]

进程启动方法

Python
import multiprocessing

# 查看可用启动方法
print(multiprocessing.get_all_start_methods())
# ['spawn', 'fork', 'forkserver']

# 设置启动方法
multiprocessing.set_start_method('spawn')  # Windows 默认

# 获取当前方法
print(multiprocessing.get_start_method())
方法说明适用平台
spawn启动新 Python 解释器Windows、Unix
fork复制父进程Unix
forkserver创建服务器进程Unix

进程方法对比

方法说明
start()启动进程
join(timeout)等待进程完成
is_alive()检查是否存活
terminate()强制终止进程
kill()强制终止(更直接)

要点总结

  • Process 创建进程,参数与 Thread 类似
  • 进程有独立内存空间,绕过 GIL
  • Queue 和 Pipe 实现进程间通信
  • Value 和 Array 实现共享内存
  • Manager 提供更灵活的共享对象
  • Windows 使用 spawn,Unix 可用 fork
  • 进程适合 CPU 密集型并行任务

📝 发现内容有误?点击此处直接编辑

← 上一篇 Python 线程池 ThreadPoolExecutor
下一篇 → Python 进程池 ProcessPoolExecutor
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库