from google_trans_new import google_translator from multiprocessing.dummy import Pool as ThreadPool import time import re """ 此版本调用最新版google_trans_new 使用多线程访问谷歌翻译接口 """ class Translate(object): def __init__(self): # 初始化翻译文本路径以及翻译目标语言 self.txt_file = './all_jobtitles.txt' self.aim_language = 'zh-CN' def translate(self, text): if text: aim_lang = self.aim_language try: t = google_translator(timeout=10) translate_text = t.translate(text, aim_lang) print(translate_text) return translate_text except Exception as e: return e print(e) def main(): time1 = time.time() # 开启八条线程 pool = ThreadPool(8) trans = Translate() txt = trans.read_txt() try: pool.map(trans.translate, txt) except Exception as e: raise e pool.close() pool.join() time2 = time.time() print("一共翻译了 {} 个句子,消耗了 {:.2f} s".format(len(txt), time2 - time1)) if __name__ == "__main__": main()
多线程本来就是不保证顺序的。假如你的数据量不是特别大的话(我看貌似你将所有文字存到了一个数组里面?`txt = trans.read_txt()`),你可以读取的时候将数据读到一个map里面,key就是行号(读取的时候弄个counter),value是一个map --- {"original": 原文本, "translated": 翻译文本},翻译的时候不输出只修改该map,全部翻译完之后统一输出。