使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计。如果你已经入门Python,并且想用线程来提升程序运行速度的话,那本文就是为你准备的!
如果你在学习Python的过程当中有遇见任何问题,可以加入我的python交流学习qq群:683380553,多多交流问题,互帮互助,群里有不错的学习教程和开发工具。学习python有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我,如果你准备学习大数据,也欢迎加入大数据学习交流qq群683380553,每天与大家分享学习资源哦。
通过阅读本文,你将了解到:
· 什么是线程?
· 如何创建、执行线程?
· 如何使用线程池ThreadPoolExecutor?
· 如何避免资源竞争问题?
· 如何使用Python中线程模块threading提供的常用工具?
目录
1. 什么是线程
2. 创建线程
2.1. 守护线程
2.2. 加入线程
3. 多线程
4. 线程池
5. 竞态条件
5.1. 单线程
5.2. 两个线程
5.3. 示例的意义
6. 同步锁
7. 死锁
8. 生产者-消费者模型中的线程
8.1 在生产者-消费者模型中使用锁
8.2 在生产者-消费者模型中使用队列
9. 线程对象
9.1 信号量
9.2 定时器
9.3 栅栏
阅读提醒:
已掌握Python基本知识;
使用Python 3.6以上版本运行。
1. 什么是线程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
在Python3中实现的大部分运行任务里,不同的线程实际上并没有同时运行:它们只是看起来像是同时运行的。
大家很容易认为线程化是在程序上运行两个(或多个)不同的处理器,每个处理器同时执行一个独立的任务。这种理解并不完全正确,线程可能会在不同的处理器上运行,但一次只能运行一个线程。
同时执行多个任务需要使用非标准的Python运行方式:用不同的语言编写一部分代码,或者使用多进程模块multiprocessing,但这么做会带来一些额外的开销。
由于Python默认的运行环境是CPython(C语言开发的Python),所以线程化可能不会提升所有任务的运行速度。这是因为和GIL(Global Interpreter Lock)的交互形成了限制:一次只能运行一个Python线程。
线程化的一般替代方法是:让各项任务花费大量时间等待外部事件。但问题是,如果想缩短等待时间,会需要大量的CPU计算,结果是程序的运行速度可能并不会提升。
当代码是用Python语言编写并在默认执行环境CPython上运行时,会出现这种情况。如果线程代码是用C语言写的,那它们就能够释放GIL并同时运行。如果是在别的Python执行环境(如IPython, PyPy,Jython, IronPython)上运行,请参考相关文档了解它们是如何处理线程的。
如果只用Python语言在默认的Python执行环境下运行,并且遇到CPU受限的问题,那就应该用多进程模块multiprocessing来解决。
在程序中使用线程也可以简化设计。本文中的大部分示例并不保证可以提升程序运行速度,其目的是使设计结构更加清晰、便于逻辑推理。
下面就来看看如何使用线程吧!
2. 创建线程
既然已经对什么是线程有了初步了解,下面让我们来学习如何创建一个线程。
Python标准库提供了threading模块,里面包含将在本文中介绍的大部分基本模块。在这个模块中,Thread类很好地封装了有关线程的子类,为我们提供了干净的接口来使用它们。
要启动一个线程,需要创建一个Thread实例,然后调用.start()方法:
import logging import threading import time def thread_function(name): logging.info("Thread %s: starting