美文网首页
Python 多线程总结

Python 多线程总结

作者: 哆啦A梦没有毛 | 来源:发表于2018-08-28 23:58 被阅读18次

最近想要用kindle看些英文原著(《权力的游戏》),但是水平不够,看起来很累,就想找找双语版的,一行英文、一行中文的那种,但是网上几乎找不到。所以就打算自己动手写个python程序,提取英文原著中的每一行英文,翻译后输出在下面。不需要很高的准确率,只要知道大致意思,能够提高我的英文阅读速度就行,所以用机器翻译就可以满足。

我之前用过Google的中文翻英文,觉得比有道、百度不知道高到哪里去,但是今天试了Google、有道、百度三家的英文转中文,感觉都差不多,都不是很准。所以我最终选了有道的,不过API还挺贵的,送了100块钱,估计翻译完一本小说也就差不多了。我发现有直接可以免费使用的API,准确率很低。不过重要的不是API,反正可以随便换,重要的是代码。

整个程序最耗时的操作在调用接口获取翻译上,所以这部分要用多线程。但问题是我需要按照顺序,先输出一行英文,接着在底下输出一行中文,多线程并发是无序的,怎么保证按顺序输出?

我没想到什么高大上的方法,就只好搞两个数组,一个存放原文(这里不考虑内存的问题,一部小说最多也就几M而已),一个存放翻译后的中文,调用函数时传入一个下标作为标志。代码如下:

# -*- coding:utf-8 -*-
# @Time: 2018/8/28 19:13
import requests
import json
import logging
import random
import hashlib
from threading import *

logging.basicConfig(level=logging.INFO)


def translate(q, index, _from='EN', _to='zh_CH'):
    url = 'https://openapi.youdao.com/api'
    app_key = ''
    salt = random.randint(0, 100)
    app_secret = ''
    data = app_key + q + str(salt) + app_secret
    sign = hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
    query_data = {
        'q': q,
        'from': _from,
        'to': _to,
        'appKey': app_key,
        'salt': salt,
        'sign': sign
    }
    response = requests.get(url, params=query_data).content.decode('utf-8')
    logging.debug(response)
    translation = json.loads(response)['translation'][0]
    trans_list.insert(index, translation)
    logging.debug("序号" + str(index) + "的翻译结果:" + translation)
    return translation


def readFromFile(file):
    with open(file) as  f:
        origin_list = [line for line in f]
    return origin_list


if __name__ == '__main__':
    trans_list = []
    threads = []
    origin_list = readFromFile('GameOfThrones.txt')
    # for i in range(0,len(origin_list)):
    for i in range(0, 100):
        if origin_list[i] == '\n':
            trans_list.insert(i, '\n')
            continue
        t = Thread(target=translate, args=(origin_list[i], i))
        t.start()
        threads.append(t)

    for t in threads:
        t.join()


    f = open('GameOfThronesDualLanguage.txt', 'w')
    for i in range(0, len(trans_list)):
        logging.debug(origin_list[i])
        f.write(origin_list[i])
        if trans_list[i] == '\n':
            continue
        logging.debug("  " + trans_list[i])
        f.write("  " + trans_list[i])
    f.close()
运行结果

现在总结下多线程的一些知识(不定期更新):

  • join()函数可使主线程进入阻塞状态,即子线程结束后主线程才会进行下一步操作。我刚开始没有使用threads数组,没有给每个线程设置join(),导致直接运行时打印的trans_list为空,因为子线程们还没产生结果程序就运行完了。
  • setDaemon(True)可以理解为和join()相反,当父线程(进程)结束后子线程会跟着结束。言下之意就是setDaemon(False)即便父线程退出,子线程仍在运行

相关文章

  • Python多进程

    Python多进程使用与总结 1.概要 ​ 众所周知,由于GIL锁的存在,Python多线程并不是真正意义上的...

  • Python 多线程总结

    最近想要用kindle看些英文原著(《权力的游戏》),但是水平不够,看起来很累,就想找找双语版的,一行英文、一行中...

  • Python多线程总结

    重要知识点 多进程和多线程都可以执行多个任务,线程是进程的一部分。 Python3 通过两个标准库 _thread...

  • Python并行

    好久之前就想写一篇关于python多线程和多进程的文章,顺便总结一下。 由于python全局锁GIL的存在,pyt...

  • GIL

    谈谈python的GIL、多线程、多进程 最近在看 Python 的多线程,经常我们会听到老手说:“python下...

  • iOS多线程:『GCD』详尽总结

    iOS多线程:『GCD』详尽总结 iOS多线程:『GCD』详尽总结

  • Python多线程编程——多线程编程中的加锁机制

    如果大家对Python中的多线程编程不是很了解,推荐大家阅读之前的两篇文章:Python多线程编程——多线程基础介...

  • Python基础总结(多线程)

    什么是进程?程序执行的时候就是进程,一个进程可以有一个线程,也可以有多个线程,多线程之间的执行由系统调度,看起来像...

  • 5-线程(补充)

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python_提高

    GIL全局解释器锁 描述Python GIL的概念, 以及它对python多线程的影响?编写⼀个 多线程抓取⽹⻚的...

网友评论

      本文标题:Python 多线程总结

      本文链接:https://www.haomeiwen.com/subject/yxvcwftx.html