multiprocessing快速入门和总结

news/2024/5/25 10:01:48/文章来源:https://blog.csdn.net/weixin_40677588/article/details/136558325

multiprocessing

官网地址:https://docs.python.org/3/library/multiprocessing.html#

1.Pool

2.Process

3.set_start_method

  • spawn
  • fork
  • forkserver

4.Exchanging objects between processes

  • Queues
  • Pipes

5.Synchronization between processes

  • Lock

6.Sharing state between processes

  • Shared memory: Value or Array
  • Server process: Manager

7.Using a pool of workers

from multiprocessing import Pool, TimeoutError
import time
import osdef f(x):return x*xif __name__ == '__main__':# start 4 worker processeswith Pool(processes=4) as pool:# print "[0, 1, 4,..., 81]"print(pool.map(f, range(10)))

8.示例:多线程翻译

创建多个线程同时调用gpt4翻译,(gpt4调用代码没有贴出来,请自行封装)核心是多线程代码。

import logging.config
import multiprocessing
import os
import time
from datetime import datetimeimport openpyxl
import yamlfrom shenmo.TUnit import TUnit
from shenmo.app_utils import identify_language
from shenmo.os_utils import get_current_file_names, get_tree_file_names
from shenmo.pat_api_utils import call_strategy_api# 定义常量:最大线程数
MAX_THREAD_COUNT = 10
MAX_SAVE_COUNT = 100
SYSTEM_MSG = 'You are a professional game translator and your task is to translate the text in the game. Chinese ' \'translated into {}. The output includes only the translation.'def setup_logging(default_path="logging.yaml", default_level=logging.INFO, env_key="LOG_CFG"):path = default_pathvalue = os.getenv(env_key, None)if value:path = valueif os.path.exists(path):with open(path, "r") as f:config = yaml.load(f, Loader=yaml.FullLoader)logging.config.dictConfig(config)else:logging.basicConfig(level=default_level)def worker(in_queue, out_queue, language_type):while True:task = in_queue.get()if task is None:  # sentinel value indicating to exitbreak# 翻译内容t1 = time.time()system_msg = SYSTEM_MSG.format(language_type)translated_value = call_strategy_api(task.get_original_text(), system_msg)t2 = time.time()# 设置耗时task.set_cost_ms(t2 - t1)if translated_value.startswith("Error:") or translated_value.startswith("Request failed:"):task.set_error_msg(translated_value)else:task.set_translated_text(translated_value)out_queue.put(task)def save_file_then_rename(origin_file_name, wb):tmp_file_name = origin_file_name + ".tmp"# 保存文件wb.save(tmp_file_name)# 删除原文件os.remove(origin_file_name)# 重命名临时文件os.rename(tmp_file_name, origin_file_name)def print_statistics(error_count, processed_count, task_count, t1):t2 = time.time()logging.info("-" * 50)logging.info(f"已处理{processed_count}条,,异常{error_count}条,总共{task_count}条,进度:{(processed_count + error_count) / task_count:.2%},已耗时:{t2 - t1:.2f}秒。保存文件中...")logging.info("-" * 50)class Translator:def __init__(self, file_name):self.file_name = file_namedef translate(self):in_queue = multiprocessing.Queue()out_queue = multiprocessing.Queue()# 打开Excel文件wb = openpyxl.load_workbook(self.file_name)# 选择sheet页“多语言翻译”sheet = wb.active# 循环遍历第2列,过滤前2行for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row):# 第一列不为空,第二列为空if (row[0].value is not None and row[0].value.strip() != "") and (row[1].value is None or row[1].value.strip() == ""):row_num = row[1].roworg_value = row[0].valuetUnit = TUnit(row_num, org_value)# 将tUnit放入队列in_queue.put(tUnit)# in_queue长度task_count = in_queue.qsize()identify_language_type = identify_language(self.file_name)logging.info(f"文件[{self.file_name}]装载完成,语言类型:{identify_language_type},共{task_count}条翻译任务,创建{MAX_THREAD_COUNT}个线程,任务即将开始...")t1 = time.time()# Create and start worker processesprocesses = []for _ in range(MAX_THREAD_COUNT):process = multiprocessing.Process(target=worker, args=(in_queue, out_queue, identify_language_type))process.start()processes.append(process)# 已处理的任务数量processed_count = 0error_count = 0# out_queue存在数据时,不断取出数据for _ in range(task_count):out = out_queue.get(block=True)if out.get_error_msg() is not None:error_count += 1logging.error(f"[{processed_count}/{task_count}]第{out.get_row_number()}行,翻译失败:{out.get_original_text()} -> {out.get_error_msg()},耗时:{out.get_cost_ms():.2f}秒。")else:processed_count += 1logging.info(f"[{processed_count}/{task_count}]第{out.get_row_number()}行,翻译成功:{out.get_original_text()} -> {out.get_translated_text()},耗时:{out.get_cost_ms():.2f}秒。")translate_text = out.get_translated_text()sheet.cell(row=out.get_row_number(), column=2).value = translate_text# 每处理100条,保存一次文件if processed_count % MAX_SAVE_COUNT == 0:print_statistics(error_count, processed_count, task_count, t1)save_file_then_rename(self.file_name, wb)if processed_count % MAX_SAVE_COUNT != 0:print_statistics(error_count, processed_count, task_count, t1)save_file_then_rename(self.file_name, wb)wb.close()logging.info(f"所有翻译任务处理完毕。")# 处理完毕,退出# Add sentinel values to signal the worker processes to exitfor _ in range(MAX_THREAD_COUNT):in_queue.put(None)logging.info("已发送线程退出信号,等待线程退出...")# Wait for all processes to finishfor process in processes:process.join()logging.info(f"所有线程已退出。")if __name__ == "__main__":# 创建文件夹:/export/logs/gpt/cache/if not os.path.exists("logs/"):os.makedirs("logs/")setup_logging()# 允许用户输入线程数量,默认10MAX_THREAD_COUNT = int(input("请输入线程数量(默认10):") or "10")logging.info(f"线程数量:{MAX_THREAD_COUNT}")directory_path = "."file_names_list = get_tree_file_names(directory_path, ".xlsx")logging.info(f"文件序号\t文件名")for file_name in file_names_list:# 打印:数组下标,文件名,语言类型logging.info(f"{file_names_list.index(file_name)}\t{file_name}")index = -1try:index = int(input("请输入要翻译的文件序号:"))except ValueError:index = -2# 检测用户输入的序号合法,执行下面代码if 0 <= index < len(file_names_list):selected_file_name = file_names_list[index]logging.info(f"你选择的文件是:[{index}]{selected_file_name}")translator = Translator(selected_file_name)translator.translate()else:logging.error(f"输入的序号[{index}]不合法,程序即将退出。")# 程序即将退出logging.info("程序即将退出。")# 暂停3秒time.sleep(3)

TUnit.py


class TUnit:# 类变量_id_alloc = 0def __init__(self, row_number, original_text):TUnit._id_alloc += 1self._id = TUnit._id_allocself.row_number = row_numberself.original_text = original_textself.translated_text = Noneself.cost_ms = 0self.error_msg = None# get iddef get_id(self):return self._id# getdef get_row_number(self):return self.row_numberdef get_original_text(self):return self.original_textdef get_translated_text(self):return self.translated_text# set translated_textdef set_translated_text(self, translated_text):self.translated_text = translated_textreturn self.translated_text# set cost_msdef set_cost_ms(self, cost_ms):self.cost_ms = cost_msreturn self.cost_msdef get_cost_ms(self):return self.cost_ms# set error_msgdef set_error_msg(self, error_msg):self.error_msg = error_msgreturn self.error_msgdef get_error_msg(self):return self.error_msgdef __str__(self):return f"row_number:{self.row_number}, original_text:{self.original_text}, translated_text:{self.translated_text}, cost_ms:{self.cost_ms}"

os_utils.py

import osdef get_tree_file_names(directory, extension):"""获取指定目录下的所有文件(包括子目录):param extension: 文件后缀(扩展名):param directory: 指定目录:return: 文件名列表"""file_names = []  # 用于存储文件名的列表# 遍历目录中的所有文件和子目录for root, dirs, files in os.walk(directory):# 将当前目录下的所有文件添加到列表中for file in files:if file.endswith(extension):file_names.append(os.path.join(root, file))return file_namesdef get_current_file_names(directory, extension):"""获取指定目录下的所有文件(不包括子目录):param directory: 指定目录:param extension: 文件后缀(扩展名):return: 文件名列表"""file_names = []  # 用于存储文件名的列表# 获取指定目录下的所有文件和子目录items = os.listdir(directory)# 遍历所有文件和子目录for item in items:# 构建文件的完整路径item_path = os.path.join(directory, item)# 检查是否是文件if os.path.isfile(item_path):# 检查文件是否以指定后缀结尾if item.endswith(extension):file_names.append(item)return file_namesif __name__ == "__main__":# 测试函数directory_path = "./国际版翻译"file_names_list = get_current_file_names(directory_path, ".xlsx")for file_name in file_names_list:print(file_name)

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

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

相关文章

Unity之PUN实现多人联机射击游戏的优化

目录 &#x1f3ae;一、 跳跃&#xff0c;加速跑 &#x1f3ae;二、玩家自定义输入昵称 &#x1f345;2.1 给昵称赋值 &#x1f345;2.2 实现 &#x1f3ae;三、玩家昵称同步到房间列表 &#x1f345;3.1 获取全部玩家 &#x1f345;3.2 自定义Player中的字段 &#…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Progress)

进度条组件&#xff0c;用于显示内容加载或操作处理等进度。 说明&#xff1a; 该组件从API version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Progress(options: ProgressOptions<Type>) 创建进度组件&a…

SpringBoot(接受参数相关注解)

文章目录 1.基本介绍2.PathVariable 路径参数获取信息1.代码实例1.index.html2.ParameterController.java3.测试 2.细节说明 3.RequestHeader 请求头获取信息1.代码实例1.index.html2.ParameterController.java3.测试 2.细节说明 4.RequestParameter 请求获取参数信息1.代码实例…

网络基础 - 预备知识(协议、网络协议、网络传输流程、地址管理)

文章目录 1. 认识 协议2. 了解 网络协议2.1 引入 协议分层2.2 OSI 七层模型 与 TCP/IP 四层模型 3. 网络传输 流程&#xff01;&#xff01;&#xff01;3.1 网络传输流程图3.2 关于报头3.3 实例解释 传输过程&#xff08;封装与解包&#xff09; 4. 网络中的地址管理4.1 认识 …

Qt中使用SDL出现error: undefined reference to `qMain(int, char**)‘

在Qt中使用SDL可能会出现下面错误error: undefined reference to qMain(int, char**) 这是因为我们在头文件中包含了SDL.h&#xff0c;这里面将main进行了替换&#xff0c;想要调用SDL_main 我们main.cpp中取消这个宏定义即可 #undef main

基于Java的天然气工程业务管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

Affinity Designer:超越想象,打造独一无二的设计作品!mac/win版

Affinity Designer是一款功能强大的图形设计软件&#xff0c;它拥有广泛的工具和功能&#xff0c;可以满足各种设计需求。无论是平面设计师、UI/UX设计师、插画师还是摄影师&#xff0c;Affinity Designer都能为他们提供所需的工具和支持。 Affinity Designer 软件获取 Affin…

1361:产生数(Produce)

【解题思路】 1、将数字拆分保存在数组中&#xff0c;而后转换每一位。 2、将数字变化规则保存在x、y两个一维数组中&#xff0c;x[i]到y[i]是一种转换规则。 3、从n的初始值开始搜索&#xff0c;对n做数字拆分&#xff0c;将拆分后的各位数字保存在一个数组中。针对数组中的每…

数字化工厂有哪些典型应用?

随着科技的飞速发展&#xff0c;数字化工厂已经成为现代制造业的重要趋势。它将先进的数字化技术应用于制造过程&#xff0c;实现了生产流程的智能化、自动化和高效化&#xff0c;为制造业带来了革命性的变革。本文将深入探讨数字化工厂的典型应用&#xff0c;并揭示其如何推动…

傅立叶之美:深入研究傅里叶分析背后的原理和数学

一、说明 T傅里叶级数及其伴随的推导是数学在现实世界中最迷人的应用之一。我一直主张通过理解数学来理解我们周围的世界。从使用线性代数设计神经网络&#xff0c;从混沌理论理解太阳系&#xff0c;到弦理论理解宇宙的基本组成部分&#xff0c;数学无处不在。 当然&#xff0c…

基于SSM技术的分布式销售平台设计与实现

目 录 摘 要 I Abstract II 1 绪论 1 1.1 课题研究背景与意义 1 1.2 国内外研究现状 1 1.2.1 国外研究现状 1 1.2.2 国内研究现状 2 1.3 本章小结 2 2 工程开发技术介绍 3 2.1 Web前端技术栈 3 2.1.1 HTML&CSS 3 2.1.2 jQuery 3 2.1.3 JSP 3 2.2 服务端开发技术栈 3 2.2.1…

【PHP+代码审计】PHP基础——运算符

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

springboot268码头船只货柜管理系统

码头船只出行和货柜管理系统的设计与实现 摘要 针对于码头船只货柜信息管理方面的不规范&#xff0c;容错率低&#xff0c;管理人员处理数据费工费时&#xff0c;采用新开发的码头船只货柜管理系统可以从根源上规范整个数据处理流程。 码头船只货柜管理系统能够实现货柜管理…

数据结构(十)——头插法和尾插法建立单链表

&#x1f600;前言 在数据结构中&#xff0c;单链表是一种常见的数据结构&#xff0c;它由一个头节点和若干个数据节点组成。创建单链表的过程可以通过头插法或尾插法来实现。头插法是将新节点插入到链表的头部&#xff0c;而尾插法是将新节点插入到链表的尾部。本文将介绍头插…

Java笔记+复习代码

Java: 复习-代码 普通5个数字排序计算5位数字中,各位数字之和swtich/ if esle: 输入10名同学的成绩6门课成绩,平均分和最高分100内奇数之和九九乘法表举行程序大赛两个数整除圆的周长和面积 基本数据类型多线程集合框架Collection实现arraylist接口ArrayList泛型(自定义泛型)ha…

Transformer模型引领NLP革新之路

在不到4 年的时间里&#xff0c;Transformer 模型以其强大的性能和创新的思想&#xff0c;迅速在NLP 社区崭露头角&#xff0c;打破了过去30 年的记录。BERT、T5 和GPT 等模型现在已成为计算机视觉、语音识别、翻译、蛋白质测序、编码等各个领域中新应用的基础构件。因此&#…

Excel下拉自动填充

1、选中需要下拉填充的单元格&#xff0c;按下Ctrl&#xff0c;然后再往下拖动填充。 下拉结果&#xff1a; 2、选中两个连续的单元格&#xff0c;往下拖动填充&#xff0c;可以填充增加两数差。 下拉结果&#xff1a; 本文为学习笔记&#xff0c;所参考文章均已附上链接&#…

复合查询【MySQL】

文章目录 复合查询测试表 单表查询多表查询子查询单行子查询多行子查询IN 关键字ALL 关键字ANY 关键字 多列子查询 合并查询 复合查询 测试表 雇员信息表中包含三张表&#xff0c;分别是员工表&#xff08;emp&#xff09;、部门表&#xff08;dept&#xff09;和工资等级表&…

Docker_搭建跨服务器网络通讯(swarm 集群)

本文目录 一、如何搭建docker的跨服务器网络1、在主服务器上初始化docker swarm 集群2、其他服务器节点加入到创建好的集群中3、检验集群是否搭建成功4、创建overlay类型的docker网络 二、如何部署服务1、docker部署2、docker-compose部署 一、如何搭建docker的跨服务器网络 1…

蓝桥杯刷题7

目录 1. 字母数 2. 列名 3. 大乘积 4. 最大连通 5. 星期几 1. 字母数 public class Main {public static void main(String[] args) {int num 2023;while(true) {String mInteger.toString(num,16);if(m.matches("^[a-f]$")){System.out.println(num);break;}n…