大数据最全multiprocessing快速入门和总结

class Translator:
def __init__(self, file_name):
self.file_name = file_name

def 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].row
            org_value = row[0].value
            tUnit = 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 processes
    processes = []
    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 = 0
    error_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 += 1
            logging.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 += 1
            logging.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 exit
    for _ in range(MAX_THREAD_COUNT):
        in_queue.put(None)

    logging.info("已发送线程退出信号,等待线程退出...")

    # Wait for all processes to finish
    for 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()

# 允许用户输入线程数量,默认10
MAX_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 = -1
try:
    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 = 0

def \_\_init\_\_(self, row_number, original_text):
    TUnit._id_alloc += 1
    self._id = TUnit._id_alloc
    self.row_number = row_number
    self.original_text = original_text
    self.translated_text = None
    self.cost_ms = 0
    self.error_msg = None

# get id
def get\_id(self):
    return self._id

# get
def get\_row\_number(self):
    return self.row_number

def get\_original\_text(self):
    return self.original_text

def get\_translated\_text(self):
    return self.translated_text

# set translated\_text
def set\_translated\_text(self, translated_text):
    self.translated_text = translated_text
    return self.translated_text

# set cost\_ms
def set\_cost\_ms(self, cost_ms):
    self.cost_ms = cost_ms
    return self.cost_ms

def get\_cost\_ms(self):
    return self.cost_ms

# set error\_msg
def set\_error\_msg(self, error_msg):
    self.error_msg = error_msg
    return self.error_msg

def get\_error\_msg(self):
    return self.error_msg

def \_\_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 os

def 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_names

def 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_names

if name == “__main__”:

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

83551)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值