结合Python代码示例说明multiprocessing模块的使用方法、Linux启动命令、服务部署及真实应用场景:


一、multiprocessing基础用法

Python的multiprocessing模块通过创建子进程实现并行计算,核心步骤如下(引用):

  1. 创建进程对象

    from multiprocessing import Process
    def worker(num):print(f"Worker {num} started (PID: {os.getpid()})")
    if __name__ == '__main__':p = Process(target=worker, args=(1,))  # 目标函数及参数
    
  2. 启动与等待

    p.start()  # 启动子进程 [[1,2,4]]
    p.join()   # 阻塞主进程直至子进程结束 [[4,6]]
    
  3. 关键方法

    • p.pid:获取进程ID
    • p.terminate():强制终止进程(需谨慎使用)
    • p.is_alive():检查进程是否存活

二、Linux系统中的启动命令

在Linux下运行Python多进程脚本:

python demo.py &  # 后台运行 [[11,14]]

或通过nohup持久化:

nohup python demo.py > log.txt 2>&1 &  

三、完整Demo:多进程部署FastAPI服务

以下示例同时启动FastAPI服务和计算任务:

import multiprocessing
import os
from fastapi import FastAPI
import uvicorn# FastAPI服务进程
def run_api():app = FastAPI()@app.get("/")def home():return {"message": "API running", "pid": os.getpid()}uvicorn.run(app, host="0.0.0.0", port=8000)# 计算任务进程
def heavy_task():result = sum(i*i for i in range(10**7))print(f"Task result: {result} (PID: {os.getpid()})")if __name__ == '__main__':# 创建进程api_proc = multiprocessing.Process(target=run_api)task_proc = multiprocessing.Process(target=heavy_task)# 启动进程api_proc.start()  # 启动API服务 [[3,9]]task_proc.start() # 启动计算任务 [[6,8]]# 等待结束(可选)task_proc.join()  # 主进程等待计算任务完成 print("Main process exits.")

服务部署说明

  1. 进程隔离
    • API服务(run_api)与计算任务(heavy_task)运行在独立进程,避免阻塞I/O 。
  2. 访问服务
    • 启动后通过[http://localhost:8000 ](http://localhost:8000 )访问FastAPI接口 。
  3. 进程资源
    • 每个进程有独立内存空间,需通过QueuePipe跨进程通信(未展示)。

四、真实应用场景

  1. CPU密集型任务

    • 如科学计算、图像处理,多进程利用多核CPU加速 。
      示例:并行处理大量数据:
    with multiprocessing.Pool(4) as pool:  # 创建4进程池results = pool.map(process_data, large_dataset)  # 并行映射 [[15,17]]
    
  2. 微服务架构

    • 同时运行多个服务(如API + 定时任务),避免单点故障 。
  3. 高并发处理

    • 每个请求分配独立进程,提升Web服务吞吐量(但需注意进程开销)。
  4. 爬虫系统

    • 多进程并行抓取不同网站,提高效率 。

五、注意事项

  1. 跨平台兼容性
    • multiprocessing在Linux/Windows均可用,但Linux基于fork(),Windows基于spawn
  2. 避免僵尸进程
    • 调用join()terminate()后需确保资源回收 。
  3. 进程数限制
    • 进程数不宜超过CPU核心数(multiprocessing.cpu_count())。

通过多进程部署服务,可显著提升系统性能和可靠性,尤其适合计算密集型和多服务协同场景。但需权衡进程创建开销与收益 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92772.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92772.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92772.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vector如何判断应该扩容?

std::vector 的扩容机制是 C 容器性能优化的一个核心点。它的判断标准、行为特征和实现细节如下所示:✅ 一、vector 的核心结构 std::vector 内部维护三个指针: begin -> 指向数据起始位置 end -> 指向当前已使用的元素末尾(size…

ICMP考点

在网络工程师、运维工程师、安全工程师等岗位的面试中,​​ICMP(Internet Control Message Protocol,互联网控制报文协议)​​ 是高频必考知识点。ICMP作为IP协议的“辅助协议”,虽然不直接传输用户数据,但…

服务器带宽具体是指什么意思?

企业在选择服务器租用或托管服务时,需要根据自身的业务情况来选择合适的服务器带宽,以便于能够让其业务持续稳定的运行工作,做到及时响应用户的访问请求,但是很多用户对于带宽一词没有过多的概念,本文就来探讨一下服务…

CANape之ASAP2 Studio介绍

提到ECU的测量标定工具,很多小伙伴第一个想到的就是CANape。但其实,除了强大的测量标定功能之外,CANape还有很多其他功能。例如,CANape中集成的小工具——ASAP2 Studio,其支持对A2L文件(由ASAM组织所定义&a…

【debug日记】MONAI SwinUNETR 目标检测项目调试总结(AI自动总结)

MONAI SwinUNETR 目标检测项目调试总结 日期: 2025年7月25日 项目: 使用 MONAI,以预训练的 SwinUNETR 为骨干网络,微调 RetinaNet 进行3D肺结节检测。 本文档旨在记录在项目配置、数据处理和模型训练过程中遇到的一系列问题及其解决方案,作为…

AI同传领域,字节跳动与科大讯飞激战进行时

在AI同声传译市场,行业巨头科大讯飞长期占据主导地位,但新晋玩家字节跳动正以迅猛姿态发起挑战。7月24日,字节旗下火山引擎正式发布豆包同声传译模型 Seed LiveInterpret 2.0,主打“人类级延迟”和“0样本声音复刻”,试…

[C++]string::substr

string substr (size_t pos 0, size_t len npos) const;substr() 主要功能是复制(截取更准确)子字符串,要求从指定位置 pos 开始,并具有指定的长度 len 。如果没有指定长度或者超出了源字符串的长度,则子字符串将延续…

KNN算法:从原理到实战全解析

一 算法介绍 K近邻(K-Nearest Neighbors, KNN)是一种基于实例的监督学习算法,适用于分类和回归任务。其核心思想是通过计算待预测样本与训练集中样本的距离,选取距离最近的K个邻居,根据这些邻居的标签进行投票&#xf…

医疗器械:DFEMA和PFEMA

在医疗器械行业,DFMEA(Design FMEA,设计失效模式及影响分析)和 PFMEA(Process FMEA,过程失效模式及影响分析)是核心的风险管理工具,旨在通过系统性识别潜在风险、分析影响并采取预防…

Qt 与 SQLite 嵌入式数据库开发

Qt 与 SQLite 的结合是开发轻量级、跨平台嵌入式数据库应用的理想选择。SQLite 作为一种零配置、文件型数据库,无需独立的服务器进程,非常适合集成到 Qt 应用中。本文将深入探讨 Qt 与 SQLite 的嵌入式数据库开发,包括基础操作、高级特性、性…

Oracle OMF 非OMF 文件 转化 不需要重建 file#.incarnation#

不需要重建就要重启, alter database datafile move 就可以在线 file#.incarnation# 是 incarnation 不是dbid Goal How to convert non OMF files to OMF files with ASM storage Datafiles are not deleted at dropping tablespace if files are non-OMF and …

大型微服务项目:听书——11 Redisson分布式布隆过滤器+Redisson分布式锁改造专辑详情接口

11 Redisson分布式布隆过滤器Redisson分布式锁改造专辑详情接口 11.1 缓存穿透解决方案&布隆过滤器 缓存穿透解决方案: 布隆过滤器: 布隆过滤器的使用: 11.2 远程调用查询所有的专辑id集合 修改: /*** 查询所有的专辑…

STM32与ADS1220实现多通道数据采集的完整分析和源程序

以下是基于STM32与ADS1220实现多通道数据采集的完整分析和源程序,结合硬件设计、通信协议及软件优化,提供高精度采集解决方案: 一、系统设计关键要点 ADS1220特性 24位高精度ΔΣ ADC,支持4路单端或2路差分输入 集成PGA(增益1~128)、基准电压和可编程电流源 多通道限制:…

百特搭AI低代码平台助力企业国际化业务敏捷拓展

在全球化浪潮下,企业扬帆出海或服务全球客户已成为重要战略。然而,开拓国际市场面临多重挑战:语言文化差异显著、本地化需求复杂多变、智能化应用需求激增、各国IT基础设施与合规要求各异。企业亟需一个能够快速响应、灵活适应,并…

epoll_event数据结构及使用案例详解

epoll_event 数据结构详解 在 Linux 的 I/O 多路复用机制 epoll 中&#xff0c;epoll_event 是关键的数据结构&#xff0c;用于描述文件描述符&#xff08;fd&#xff09;上的事件和关联数据。其定义在头文件 <sys/epoll.h> 中&#xff1a; struct epoll_event {uint32_t…

C++11STL容器map和set简单介绍

一、引言map和set底层结构比较复杂&#xff0c;我认为我们先谈基本介绍再谈C11&#xff0c;最后再谈map和set底层以及map和set封装。二、简单介绍一下map和setmap和set底层都是红黑树&#xff0c;是二叉搜索树的一种&#xff0c;查找非常快。不像数组、链表一样一个一个对比&am…

Java线程基础面试复习笔记

1. 线程与进程的区别进程是正在运行程序的实例&#xff0c;线程是进程中的执行单元。主要区别&#xff1a; 内存空间&#xff1a;不同进程使用不同的内存空间&#xff0c;同一进程下的线程共享内存空间资源开销&#xff1a;线程更轻量&#xff0c;线程上下文切换成本比进程上下…

面试题(技术面+hr面)

面试技术面HR面后端HR面常见问题*稳定性&#xff0c;上进心&#xff0c;目标感&#xff0c;抗压能力&#xff0c;学习能力*回答问题时注意体现上面五点&#xff0c;即使瞎扯也尽量往上靠。面经项目相关介绍一下你收获最大的一个项目你们团队有多少人&#xff0c;怎么分工的开发…

本地部署Dify教程

克隆 Dify 代码仓库克隆 Dify 源代码至本地。git clone hts://github.com/langgenius/dify.git启动 Dify进入 Dify 源代码的 docker 目录&#xff0c;执行一键启动命令:cd dify/docker #切换到指定目录 cp .env.example .env #修改文件名 docker compose up -d #启动

Android Kotlin 协程全面指南

协程是 Kotlin 提供的一套简化异步编程的轻量级线程操作框架&#xff0c;特别适合 Android 开发中的异步任务处理。以下是 Android 开发中需要掌握的协程核心知识点&#xff1a;1. 协程基础概念1.1 协程是什么轻量级线程&#xff1a;比线程更高效&#xff0c;可以在单个线程中运…