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()
相关推荐
Hello.Reader1 分钟前
BERT 和 GPT 为什么结构不同?——Encoder 与 Decoder 图解
人工智能·gpt·bert
AI浩3 分钟前
引导多模态大语言模型用于弱监督类无关物体计数
人工智能·语言模型·自然语言处理
xiaoxue..3 分钟前
大模型全栈技术图谱:LLM → Token → Context → Prompt → Tool → MCP → Agent → Skill
人工智能·ai·大模型
Shining05964 分钟前
AI 编译器系列(五)《拓展 Triton 深度学习编译器——DLCompiler》
人工智能·深度学习·学习·其他·架构·ai编译器·infinitensor
小邓睡不饱耶12 分钟前
东方财富网股票数据爬取实战:从接口分析到数据存储
开发语言·爬虫·python·网络爬虫
2401_8916558113 分钟前
GitHub镜像站搭建全攻略技术文章大纲
python·github
cm65432016 分钟前
使用XGBoost赢得Kaggle比赛
jvm·数据库·python
yzx99101317 分钟前
WorkBuddy 使用指南:解锁几大核心功能,提升工作效率
人工智能·python
蛐蛐蛐17 分钟前
在昇腾310P推理服务器上安装CANN和PyTorch
人工智能·pytorch·python·npu
科技林总18 分钟前
如何安全地使用龙虾[特殊字符]
人工智能·安全