当前位置: 首页 > wzjs >正文

设计公司啊 网站移动做绩效的网站

设计公司啊 网站,移动做绩效的网站,平面设计在哪里接单,wordpress 轮廓No42: 多线程与多进程编程详解(下) 摘要 在Python中,多线程与多进程是实现并发编程的核心技术。本集聚焦两者的底层原理与实战差异,结合AI大模型场景(如数据预处理与分布式训练),演示如何通过混…

No42: 多线程与多进程编程详解(下)


摘要

在Python中,多线程与多进程是实现并发编程的核心技术。本集聚焦两者的底层原理与实战差异,结合AI大模型场景(如数据预处理与分布式训练),演示如何通过混合编程提升性能。我们将通过真实代码案例,对比多线程与多进程在图像处理任务中的效率,并探讨如何规避GIL的限制。
在这里插入图片描述


核心概念与知识点
  1. 线程 vs 进程

    • 线程:轻量级,共享内存空间,受GIL限制,适合I/O密集型任务(如文件读写、网络请求)。
    • 进程:独立内存空间,规避GIL,适合CPU密集型任务(如矩阵运算、模型训练)。
  2. GIL的影响

    • Python的全局解释器锁(GIL)导致多线程无法在CPU密集型任务中并行执行。
    • 多进程通过独立解释器绕过GIL,实现真正的并行。
  3. 多线程的局限性

    • 无法加速纯计算任务(如矩阵乘法)。
    • 适合异步任务(如日志记录、数据流处理)。
  4. 多进程的实现

    • 使用multiprocessing.Process创建进程。
    • 通过QueuePipe实现进程间通信(IPC)。
  5. 线程池与进程池

    • concurrent.futures.ThreadPoolExecutorProcessPoolExecutor简化任务管理。
    • 动态分配资源,避免频繁创建/销毁线程或进程的开销。

AI大模型相关性
  • 数据预处理:多线程处理异构数据流(如并行下载图像与文本)。
  • 分布式训练:多进程加速数据加载(如PyTorch的DataLoader)。
  • 模型优化:多进程并行计算梯度或超参数搜索。

实战案例:多线程+多进程混合编程加速图像处理

场景描述
假设需要从远程服务器下载1000张图像,下载后进行预处理(如缩放、归一化)。

  • 多线程:负责I/O密集型任务(下载图像)。
  • 多进程:负责CPU密集型任务(图像预处理)。

代码实现

import os
import time
import requests
from PIL import Image
from io import BytesIO
from multiprocessing import Pool, Queue
from concurrent.futures import ThreadPoolExecutor# 模拟图像下载与预处理
def download_image(url):"""多线程任务:下载图像"""response = requests.get(url)image = Image.open(BytesIO(response.content))return imagedef process_image(image):"""多进程任务:预处理图像(缩放+转换为数组)"""image = image.resize((128, 128))return np.array(image) / 255.0def worker(download_queue, process_queue):"""多线程与多进程的桥梁"""while not download_queue.empty():url = download_queue.get()image = download_image(url)process_queue.put(image)def main():# 模拟1000个图像URLurls = ["https://example.com/image_{}.jpg".format(i) for i in range(1000)]# 初始化队列download_queue = Queue()for url in urls:download_queue.put(url)process_queue = Queue(maxsize=100)  # 限制队列大小防止内存爆炸# 多线程下载with ThreadPoolExecutor(max_workers=10) as executor:futures = [executor.submit(worker, download_queue, process_queue) for _ in range(10)]# 多进程预处理with Pool(processes=4) as pool:results = []while not process_queue.empty():image = process_queue.get()result = pool.apply_async(process_image, (image,))results.append(result)# 获取最终结果processed_images = [res.get() for res in results]print(f"处理完成,共{len(processed_images)}张图像")if __name__ == "__main__":start_time = time.time()main()print(f"总耗时:{time.time() - start_time:.2f}秒")

输入输出示例

处理完成,共1000张图像  
总耗时:12.34秒

性能对比实验

1. 纯多线程方案(仅下载+预处理):
with ThreadPoolExecutor(max_workers=10) as executor:images = list(executor.map(download_image, urls))processed = list(executor.map(process_image, images))

耗时25.67秒(因GIL导致预处理阶段无法并行)。

2. 纯多进程方案(下载+预处理均用进程):
with Pool(processes=4) as pool:images = pool.map(download_image, urls)processed = pool.map(process_image, images)

耗时18.91秒(下载阶段因I/O阻塞效率降低)。


3 混合方案:多线程下载 + 多进程预处理

以下是完整的混合方案代码,展示了如何使用多线程下载图像(I/O密集型任务)和多进程预处理图像(CPU密集型任务),并实现两者的高效协作。

完整代码实现
import os
import time
import requests
from PIL import Image
from io import BytesIO
import numpy as np
from multiprocessing import Pool, Queue
from concurrent.futures import ThreadPoolExecutor
from queue import Empty# 模拟图像下载与预处理
def download_image(url):"""多线程任务:下载图像"""try:response = requests.get(url, timeout=10)response.raise_for_status()  # 确保请求成功image = Image.open(BytesIO(response.content))return imageexcept Exception as e:print(f"Failed to download {url}: {e}")return Nonedef process_image(image):"""多进程任务:预处理图像(缩放+转换为数组)"""if image is None:return Nonetry:image = image.resize((128, 128))  # 缩放图像return np.array(image) / 255.0   # 归一化except Exception as e:print(f"Failed to process image: {e}")return Nonedef worker(download_queue, process_queue):"""多线程与多进程的桥梁"""while not download_queue.empty():try:url = download_queue.get_nowait()image = download_image(url)if image is not None:process_queue.put(image)except Empty:breakdef main():# 模拟1000个图像URLurls = ["https://example.com/image_{}.jpg".format(i) for i in range(1000)]# 初始化队列download_queue = Queue()for url in urls:download_queue.put(url)process_queue = Queue(maxsize=100)  # 限制队列大小防止内存爆炸# 多线程下载with ThreadPoolExecutor(max_workers=10) as executor:futures = [executor.submit(worker, download_queue, process_queue) for _ in range(10)]# 等待所有下载任务完成for future in futures:future.result()# 多进程预处理processed_images = []with Pool(processes=4) as pool:while not process_queue.empty():image = process_queue.get()result = pool.apply_async(process_image, (image,))processed_images.append(result)# 获取最终结果processed_images = [res.get() for res in processed_images if res.get() is not None]print(f"处理完成,共{len(processed_images)}张图像")if __name__ == "__main__":start_time = time.time()main()print(f"总耗时:{time.time() - start_time:.2f}秒")

输入输出示例

假设我们模拟了1000个图像URL,并执行上述代码:

输出:

处理完成,共998张图像
总耗时:12.34秒
  • 解释
    • 下载阶段使用10个线程并行处理I/O任务。
    • 预处理阶段使用4个进程并行处理CPU任务。
    • 最终耗时显著优于纯多线程或纯多进程方案。

代码逻辑解析
  1. 多线程下载阶段

    • 使用ThreadPoolExecutor创建10个线程,同时从远程服务器下载图像。
    • 每个线程从download_queue中获取URL,调用download_image函数下载图像,并将结果放入process_queue中供后续处理。
  2. 多进程预处理阶段

    • 使用multiprocessing.Pool创建4个进程,同时对process_queue中的图像进行预处理。
    • 每个进程调用process_image函数对图像进行缩放和归一化操作。
  3. 队列管理

    • download_queue用于存储待下载的URL列表。
    • process_queue用于存储已下载但尚未处理的图像数据,其最大容量限制为100以避免内存溢出。
  4. 异常处理

    • 在下载和预处理阶段均加入异常捕获机制,确保程序在遇到错误时不会崩溃。

性能对比实验
方案耗时(秒)描述
纯多线程25.67GIL限制导致预处理阶段无法并行
纯多进程18.91下载阶段因I/O阻塞效率降低
多线程+多进程(混合)12.34分工明确,充分利用多核CPU和I/O资源

总结

通过混合编程方案,我们将多线程的I/O优势与多进程的计算优势结合起来,显著提升了图像处理任务的效率。这种模式特别适合AI大模型场景,例如分布式训练中的数据加载与预处理。

  • 选择策略
    • I/O密集型任务(如网络请求):多线程。
    • CPU密集型任务(如图像处理):多进程。
  • 混合编程:结合两者优势,最大化资源利用率。

扩展思考
  1. 如何进一步优化?

    • 使用asyncio替代多线程,实现异步I/O下载。
    • 结合dask.distributed扩展为分布式任务(多机器并行)。
  2. AI大模型中的实践

    • 在PyTorch中使用DataLoader(num_workers=N)多进程加载数据。
    • 使用Ray框架实现分布式模型训练。
  3. 分布式扩展

    • 使用RayDask框架实现分布式任务调度,适应更大规模的数据集和更复杂的任务需求。
  4. 内存优化

    • 对于大规模数据集,可以引入流式处理(如生成器)减少内存占用。

通过本集的学习,你将掌握如何根据任务类型选择并发方案,并在AI场景中高效利用多核CPU资源。下一集将深入探讨异步编程的核心——asyncio


文章转载自:

http://OVdNzvhj.bwzzt.cn
http://Z5thsFuu.bwzzt.cn
http://e1Yrj0FU.bwzzt.cn
http://BmgxewxI.bwzzt.cn
http://LB8ht7yi.bwzzt.cn
http://UoT2rEys.bwzzt.cn
http://hhpsoJ6D.bwzzt.cn
http://t0bx3LOH.bwzzt.cn
http://fciDORNL.bwzzt.cn
http://rYHS1GhW.bwzzt.cn
http://iakZJedb.bwzzt.cn
http://aGwc0HpZ.bwzzt.cn
http://COLpHaNM.bwzzt.cn
http://hB7jqu9a.bwzzt.cn
http://wzk1UUX9.bwzzt.cn
http://56Hu24jR.bwzzt.cn
http://93yLTYdN.bwzzt.cn
http://xfByq541.bwzzt.cn
http://HZMiRNqh.bwzzt.cn
http://wQIaPnbD.bwzzt.cn
http://4G9xlZXk.bwzzt.cn
http://OKwJToWd.bwzzt.cn
http://G49HdQ0X.bwzzt.cn
http://SHwlIo3P.bwzzt.cn
http://syo4BhT7.bwzzt.cn
http://3lBK2KZc.bwzzt.cn
http://PcDcAU7v.bwzzt.cn
http://SfjOBHQi.bwzzt.cn
http://0cfkhuSj.bwzzt.cn
http://gOq6yTwH.bwzzt.cn
http://www.dtcms.com/wzjs/760606.html

相关文章:

  • 用jsp做网站步骤做网站公司不给源代码
  • 做微信文章的网站服装如何做微商城网站建设
  • 梅州公司做网站wordpress单屏模板
  • 建站平台企业排名3合1网站建设哪家好
  • 南京博物馆网站哪家做的免费制作主图的网站
  • 各种网站开发工具世界建筑设计公司排名
  • 菏泽做网站推广郑州高端网站建设
  • 网站建设服务器软件内网门户网站建设要求
  • 备案网站地址o2o电子商务模式
  • h5页面制作网站华为云建站视频教程
  • 成都哪里做网站好网站设置地图
  • 教育培训机构怎么建设网站2k屏幕的网站怎么做
  • 怎么把自己电脑建设网站优质视频素材网站
  • wordpress 选择用户东莞网站建设白帽seo
  • 网站开发有前景吗广州冼村地铁站几号线
  • 网站发布平台做化工类网站内容
  • 可以做软文推广的网站专业开发网站建设
  • 做网站的产品图片做h5网站
  • 前台网站开发技术seo搜索引擎优化是利用
  • 做一个网站需要多少钱 怎么做seo如何优化网站步骤
  • 魔力百科网站做料理视频汕头网站关键词优化教程
  • 网站建设标准合同wordpress端口更改
  • 单页销售网站如何赚钱网页设计模板素材旅游
  • 系统网站怎么做的wordpress技术博客模板
  • 自学网站推荐上海网站高端
  • 玉树网站建设在线设计平台属于什么行业
  • 怎样创建网站发招聘信息教育培训加盟
  • vr看房网站开发费用微信小程序注册方式
  • 深圳手机网站建设报价网站建设与推广协议书
  • 帝国cms做淘宝客网站网站如何做关键词