python入门系列十四(多进程)

1.引言

刚刚学完python的多线程编程内容,怎么还需要多进程呢?都是并行提升应用处理性能的方案。

这里不得不再次说起python的全局解释器锁GIL的存在,它要求同一时刻只能有一个线程执行python字节码,如果是I/O密集型的任务,这没有问题!当一个线程在待等I/O的时间可以切换另外一个线程执行。但如果是CPU密集型任务,那就只能靠多进程方案了。

选择多进程方案理由,有这么几个:

  • CPU密集型任务,比如数学计算,图像处理
  • 充分利用多核CPU,让每个进程独立使用CPU核心
  • 提供应用稳定性,每个进程都有自己的独立空间,单个进程崩溃不影响其它进程

当然,任何方案都有两面性,多进程方案有它的缺点,进程比起线程,要消耗更多资源。

2.多进程案例

2.1.入门案例

python中提供multiprocessing模块,支持多进程编程。

python 复制代码
import multiprocessing
import os

# 定义进程任务,模拟耗时计算
def task(name):
    print(f"子进程 {name} PID: {os.getpid()}")
    # 模拟耗时计算
    result = sum([i * i for i in range(1000000)])
    print(f"子进程 {name} 计算结果: {result}")

# 启动执行
if __name__ == '__main__':
    print(f"主进程 PID: {os.getpid()}")
    # 创建子进程,启动,等待执行完成
    p = multiprocessing.Process(target=task, args=("进程1",))
    p.start()
    p.join()

    print("所有进程执行完毕")

2.2.进程池

和线程池一样,本质是解决提升资源利用率的方案,相比较起来,进程要比线程消耗更多的资源,是一个重量级的方案。对于资源的复用更有实际意义。

python 复制代码
from multiprocessing import Pool
import time
import os

# 定义任务
def square(x):
    print(f"进程PID:{os.getpid()}执行计算任务 {x} 的平方")
    time.sleep(1)  # 模拟耗时操作
    return x * x

# 主函数
if __name__ == '__main__':
    with Pool(3) as pool:  # 创建3个进程的池
        numbers = [1, 2, 3, 4, 5]
        results = pool.map(square, numbers)

    print("计算结果:", results)

2.3.进程间通信

多任务并发处理,往往有彼此协作通信的需求,不管是多线程,还是多进程。多线程我们可以通过共享内存,多进程可以通过队列Queue方案。

生产者,消费者示例:

python 复制代码
from multiprocessing import Process, Queue
import os

# 定义生产者任务
def produce(q):
    for i in range(5):
        q.put(f"产品:{i}")
        print(f"生产者 {os.getpid()}生产产品:{i}")

# 定义消费者
def consume(q):
    while True:
        item = q.get()
        if item is None:
            break
        print(f"消费者PID:{os.getpid()}消费{item}")

# 主函数
if __name__ == '__main__':
    q = Queue()

    producer = Process(target=produce, args=(q,))
    consumer = Process(target=consume, args=(q,))

    producer.start()
    consumer.start()

    producer.join()
    q.put(None)  # 发送结束信号
    consumer.join()
相关推荐
暖光资讯7 小时前
前行者获2025抖音最具影响力品牌奖,亮相上海ZFX装备前线展,引领外设行业“文化科技”新浪潮
人工智能·科技
guslegend7 小时前
第3章:SpringAI进阶之会话记忆实战
人工智能
田姐姐tmner7 小时前
Python切片
开发语言·python
陈橘又青7 小时前
100% AI 写的开源项目三周多已获得 800 star 了
人工智能·后端·ai·restful·数据
t***31657 小时前
爬虫学习案例3
爬虫·python·学习
中杯可乐多加冰7 小时前
逻辑控制案例详解|基于smardaten实现OA一体化办公系统逻辑交互
人工智能·深度学习·低代码·oa办公·无代码·一体化平台·逻辑控制
IT_陈寒8 小时前
Redis实战:5个高频应用场景下的性能优化技巧,让你的QPS提升50%
前端·人工智能·后端
AI小云8 小时前
【数据操作与可视化】Pandas数据处理-其他操作
python·pandas
龙智DevSecOps解决方案8 小时前
Perforce《2025游戏技术现状报告》Part 1:游戏引擎技术的广泛影响以及生成式AI的成熟之路
人工智能·unity·游戏引擎·游戏开发·perforce
大佬,救命!!!8 小时前
更换适配python版本直接进行机器学习深度学习等相关环境配置(非仿真环境)
人工智能·python·深度学习·机器学习·学习笔记·详细配置