multiprocessing快速入门和总结

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.mzph.cn/news/731111.shtml

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

相关文章

第十九节 Java 日期时间

java.util包提供了Date类来封装当前的日期和时间。 Date类提供两个构造函数来实例化Date对象。 第一个构造函数使用当前日期和时间来初始化对象。 Date( )第二个构造函数接收一个参数&#xff0c;该参数是从1970年1月1日起的毫秒数。 Date(long millisec)Date对象创建以后&a…

cadence 之 Allegro PCB封装 3D模型

Allegro PCB封装怎样赋3D模型 1、方式一 —— 设置器件高度 2、方式二 —— 指定STEP模型 2.1、Step 3D模型库 2.2、软件环境的设置和 STEP 模型库路径设置 D:\Cadence\Cadence_SPB_17.4-2019\share\local\pcb\step 2.3、指定STEP模型 即可打开 STEP 模型指定的对话框&…

【理解】STM32一键下载电路

1.MCUISP 串口软件一键下载设置&#xff1a; DTR 低电平复位&#xff0c;RTS 高电平进入boot load 串口下载 在ch340 芯片对应DTR 和RTS 输出电平与电脑软件设置的电平相反。 一键下载电路根据ch340 芯片对应引脚的控制信号完成对应功能 具体实现过程如下&#xff1a; 2.单…

Spring MVC ModelAndViewMethodReturnValueHandler原理解析

在Spring MVC框架中&#xff0c;ModelAndViewMethodReturnValueHandler是一个用于处理Controller方法返回ModelAndView对象的HandlerMethodReturnValueHandler实现类。这个处理器专门负责将Controller方法返回的ModelAndView对象转化为HTTP响应&#xff0c;包括模型和视图的渲染…

VR数字化线上展馆降低企业投入成本和周期

VR云展会是一种全新的展览形式&#xff0c;它利用虚拟现实技术&#xff0c;将实体展览搬到线上&#xff0c;让观众可以在家中就能参观各种展览。这种新型的展览方式有许多亮点&#xff0c;下面就来详细介绍一下。 首先&#xff0c;VR云展会打破了地域限制。传统的实体展览通常只…

uniapp微信小程序 提示消息 上传文件

uni.showToast() 提示消息 uni.showToast({icon: success,title: 操作成功 }) icon&#xff1a;可填 success: 显示成功图标&#xff0c; error: 显示错误图标&#xff1b; fail: 显示错误图标&#xff0c;此时title文本无长度显示&#xff1b; exception: 显示异常图标&…

WPF 消息提示 类似toast方式

WPF里面的消息提示一般都是MessageBox.Show()&#xff0c;这种样式不是很好看&#xff0c;所以就想办法重新搞了一个类似弹出消息的功能。原理很简单&#xff0c;就是弹出一个新窗体&#xff0c;然后等几秒窗体自动关闭。 先上效果图&#xff1a; 新建一个MsgHelper.cs类&…

python删除创建的conda虚拟环境

要删除已创建的conda虚拟环境&#xff0c;可以使用conda env remove命令&#xff0c;并指定要删除的虚拟环境的路径。以下是详细的步骤&#xff1a; 打开命令行界面&#xff08;例如&#xff0c;Anaconda Prompt或终端&#xff09;。 使用conda env list命令查看当前存在的虚拟…

海外互联网专线主要解决企业哪些办公问题?

海外互联网专线 是一种专门为跨境企业提供的网络连接服务&#xff0c;旨在解决企业在海外办公过程中遇到的各种网络问题。海外互联网专线如何成为解决企业办公难题的利器&#xff0c;为企业提供稳定、高速的网络连接? 1、跨国远程办公&#xff1a; 随着全球化进程的加速&…

Android应用界面

概述&#xff1a;由于学校原因&#xff0c;估计会考&#xff0c;曹某人就浅学一下。 目录 View概念 创建和使用布局文件 相对布局 线性布局 水平线性布局 垂直线性布局 表格布局 帧布局 扁平化布局 Android控件详解 AdapterView及其子类 View概念 安卓中的View是所…

Codesys.运动控制电子齿轮

文章目录 一. 电子齿轮概念应用 二. 电子齿轮耦合功能块 2.1. MC_GearIn 2.2. MC_GearInPos 2.3. MC_GearOut 三. 电子齿轮案例 3.1. 样例介绍 3.2. 引入虚轴 3.3. 程序框架 3.4. 程序编写 3.5. 程序监控 一. 电子齿轮概念应用 在很多应用场景中有多个牵引轴每个牵引…

habitat模型训练总结(一):点导航PPO

本文对habitat环境中的baseline点导航PPO的模型的构建和训练进行总结 0 训练代码 这个代码在上一篇文章出现过,再粘贴过来,如下: import random import numpy as np from habitat_baselines.common.baseline_registry import baseline_registry from habitat_baselines.c…

pytest 测试常用功能

1. pytest基础功能 命名规则 文件名以test_*.py文件和*_test.py 以test_开头的函数 以Test开头的类, 注意&#xff1a;类不能包含__init__构造函数 以test_开头的方法 所有的包pakege必须要有__init__.py文件常用命令 pytest --help # 查看帮助cmd执行pytest用例有三种方法…

【重温设计模式】备忘录模式及其Java示例

备忘录模式的概述 在软件设计的世界中&#xff0c;备忘录模式是一种行为设计模式&#xff0c;它的主要作用是保存对象的当前状态&#xff0c;以便在将来的某个时间点&#xff0c;可以将对象恢复到这个保存的状态。这种模式的命名源于生活中的备忘录&#xff0c;我们常常用它来…

俄罗斯方块h5源码

上传源码至服务器和空间即可使用&#xff0c;源码无后门&#xff0c;就一天html文件&#xff0c;一个两个css文件以及一个js文件 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88897605 更多资源下载&#xff1a;关注我。

148个Chatgpt关键词汇总-有爱AI实战教程(二)

演示站点&#xff1a; https://ai.uaai.cn 技能模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…

devops-Maven【部署及配置】

1、准备maven工具包&#xff0c;Maven官网下载Maven的安装包 Maven – Download Apache Maven Index of /maven (apache.org) 选择后缀是.bin.tar.gz的文件下载&#xff0c;此处下载的版本是3.9.6。 2、安装maven的目录下&#xff0c;建一个Maven路径&#xff0c;然后把压缩…

JAVA虚拟机实战篇之内存调优[5](诊断和解决问题-两种方式总结)

文章目录 版权声明诊断和解决问题 - 两种方案在线定位问题步骤在线定位问题 – btrace 总结内存溢出&内存泄漏内存溢出原因解决内存泄漏方法 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权…

springboot项目docker分层构建

一、需求场景 在使用dockerfile构建springboot项目时&#xff0c;速度较慢&#xff0c;用时比较长&#xff0c;为了加快构建docker镜像的速度&#xff0c;采用分层构建的方式 二、构建配置 1、pom.xml配置 <properties><project.build.sourceEncoding>UTF-8<…

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明&#xff1a;正弦波。x&#xff1a;NumPy数组 # 所有的数据&#xff0c;进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…