Python利用队列Queue实现多进程Process间通信

news/2025/1/7 21:18:20/

背景:

我在利用大模型进行推理的时候,一个机器上面有8张GPU卡,如何充分的利用这几张卡呢?最开始想到的是利用Python多线程方案,可代码实现之后发现虽然我在环境变量里面设置可以使用多张GPU卡,可程序依然只使用了第一张卡,于是就想利用多进程来实现

代码:

from multiprocessing import Queue
import time
import multiprocessing as mp
#这里是定义一个函数,将一个目录下面的文件添加到队列里面,该函数由主进程调用
def put_data(queue, root_dir):    message_dir = os.path.join(root_dir, "message");file_count = 0file_names =[]for item in os.listdir(message_dir):sub_path = os.path.join(message_dir, item)if os.path.isdir(sub_path):for subItem in os.listdir(sub_path):sub_item_path = os.path.join(sub_path, subItem)if os.path.isfile(sub_item_path):file_names.append(sub_item_path)file_count = file_count + 1#这里根据文件的创建时间进行排序file_names = sorted(file_names, key=lambda x: os.path.getctime(x))#取文件创建时间最新的一百个文件file_names = file_names[-100:]#文件添加到队列里for file_name in file_names:queue.put(file_name)return file_count
#这里定义一个函数,这个函数是后面创建进程将会执行的方法
#gpu_id:该进程将利用哪一块GPU,
def worker(gpu_id, queue, process_num):print(f"此时正在执行的GPU num:{gpu_id} --- process_num:{process_num}")os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"#通过设置该环境变量来确保GPU对该进程可见os.environ["CUDA_VISIBLE_DEVICES"] = gpu_idwhile True:try:#从队列里面获取文件名称file_name = queue.get();#通过重命名文件来解决队列里面可能存在的重复文件名问题,#解决主进程在添加文件时,添加了重复的文件new_filename = file_name + ".bak"try:os.rename(file_name, new_filename)print(f"此时正在执行的GPU num:{gpu_id} --- process_num:{process_num},文件已成功重命名为:{new_filename}")except:print(f"此时正在执行的GPU num:{gpu_id} --- process_num:{process_num},文件重命名失败:{new_filename}")except Exception as outExceiption:print('Error:', outExceiption)processes = []
queue = Queue()
for i in range(5, 9):for process_num in range(1):#创建进程,并传递对应的执行函数,和函数的参数process = mp.Process(target=worker, args=(str(i),queue, process_num))processes.append(process)#启动进程process.start()
print(f"process count : {len(processes)}")root_dir = "/data/test"while True:if queue.qsize() < 20:file_count = put_data(queue, root_dir)print(f"main process find file size : {file_count}")if file_count == 0:time.sleep(5)else:time.sleep(5)

结论:

利用multiprocessing的Process可以非常方便的实现多进程架构,另外使用它的Queue也可以非常便捷的进行进程间通信,这样每个进程指定特定的GPU卡,就实现了GPU卡的利用。


http://www.ppmy.cn/news/1164792.html

相关文章

【K8S】Kubernetes

mesos apache基金会&#xff0c;后来是推特公司 mesos分布式资源管理框架2019淘汰 marathon 容器编排框架 用来调度、编排运行的常驻服务 mesos marathon 容器管理 k8s容器或云平台两种趋势&#xff08;工资好&#xff09; 1.K8s是什么 K8s全称为 Kubernetes&#xff…

第六十二章 符号概览

文章目录 第六十二章 符号概览.. (Two Periods)..abcdef..abcdef(xxx)..#abcdef ... (Three Periods)abcdef... # (Pound Sign)#abcdef##abcdef##class(abc.def).ghi(xxx)##super() 第六十二章 符号概览 .. (Two Periods) 在每种情况下&#xff0c;两个句点一起构成从一个类成…

【七:(测试用例)spring boot+testng+xml+mock实现用例管理+数据校验】

目录 1、目录结构的相关类cases类1、添加用户 AddUserTest2、获取用户列表信息 GetUserInfoListTest3、获取用户信息 GetUserInfoTest4、登录测试5、更新用户信息 config类1、报告配置2、用户路径配置 model类utils类 配置配置类SQLMapper.xmlspring boot全局配置databaseConfi…

git仓删除当前仓且保留嵌套子仓--类似保留特定文件目录

当前git若有损坏需删除重新下载&#xff0c;但其还含有子仓&#xff0c;不能直接删除整体目录。清理方法如下&#xff1a; 分如下两种场景 1、若是子仓当前没有进行任何操作&#xff0c;即子仓可以临时移动 这种比较简单&#xff0c;分如下几步&#xff1a; step1:找到全部子…

浅谈单例模式

饿汉式懒汉式/Double check&#xff08;双重检索&#xff09;静态内部类枚举单例 饿汉式 private static final DispatchSingleton instence new DispatchSingleton();public static DispatchSingleton getInstence() {return instence;} 饿汉式是在jvm加载这个单例类的时候&…

Go语言入门心法(六): HTTP面向客户端|服务端编程

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 一:go语言面向web编程认知 Go语言的最大优势在于并发与性能,其性能可以媲美C和C,并发在网络编程中更是至关重要 使用http发送请…

树莓派+RTL-SDR 搭建APRS iGATE

最近买了个FT-5DR&#xff0c;准备玩APRS&#xff0c;但是长沙的iGATE少的可怜&#xff0c;为了让自己的呼号显示到APRS.TV&#xff0c;只能自己折腾一个iGATE了。 淘宝上有现成的产品&#xff0c;不过要花几百块钱&#xff0c;有点划不来&#xff0c;本着业余无线电不怕折腾的…

MVC netbeans数据库操作注意事项

前端通过Form传递到后端Servlet注意事项 MVC是Mode View Control三层架构模式 Mode封装了数据库实体类 View封装了前端界面 Control通过Servlet实现 在数据库方面需要注意&#xff1a; 首先是jdbc封装 通过 username pssword driver,url进行封装。 class.forname加载驱…