线程、进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实际使用这三种东西python
参考: 进程、线程、协程之概念理解shell
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操做系统结构的基础。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
协程:一个程序能够包含多个协程,能够对比于一个进程包含多个线程,于是下面咱们来比较协程和线程:咱们知道多个线程相对独立,有本身的上下文,切换受系统控制;而协程也相对独立,有本身的上下文,可是其切换由本身控制,由当前协程切换到其余协程由当前协程来控制。编程
磨刀不误砍柴工,在用实例讲解线程、进程和协程怎么使用以前,先准备一些工具:session
实际上多线程、多进程和协程,都属于并发编程,并发编程的最重要的目标就是提升程序运行的效率,那么咱们须要一个计算一个函数耗时长度的工具,用于对比不一样方式程序的运行时间,这里咱们写一个函数计时装饰器fn_timer来完成这件事:多线程
该装饰器的用法示例:并发
运行代码输出:app
实际使用中,大规模爬虫程序很适合用并发来实现,因此咱们再准备一些网址放在urls列表中,用于测试爬虫程序的效率(都是百度百科的一些词条页面):dom
整合:把函数计时装饰器和urls列表封装在一个类:utils.py中:异步
从听音乐、看电影讲起socket
我如今要作两件事情:听音乐、看电影,听一首音乐假如耗时1秒,看一部电影假如耗时5秒,用两个函数定义这两个任务以下:
假如我如今要听10首音乐、看2部电影,那么我就有以下几种方案:
方案一:先一个个听完10首音乐,再一个个看完2部电影,顺序完成,代码以下:
让咱们执行一下这段代码,输出以下:
能够看到,老老实实严格按照前后顺序来一件件作这些事情,所需的总时间和每件事情耗时加起来是同样多的。
方案二:刚刚的方案不太好,太费时间了,那么能不能同时进行一些事情呢?答案是能够的,能够同时听多首音乐,同时看多部电影进行,代码以下:
执行上述代码,运行结果:
此次只用了5秒就完成了,完成效率显著提高。此次试用多线程执行多个任务,全部任务最终的总耗时 = 耗时最长的那个单个任务的耗时,即看一部电影的5秒钟时间。
方案三:使用线程池。上面使用多线程的方式比较繁琐,下面使用线程池来实现:
执行结果:
能够看出使用线程池反而比手工调度线程多耗时一秒钟,多是由于线程池内部对线程的调度和线程切换的耗时形成的。
实例:使用多线程下载网页
话很少说,直接上代码,用多线程并发下载20个百度百科网页的实例代码及运行结果以下:
多进程和进程池的使用
实例代码以下:
进程之间的通讯
进程间的通讯采用队列来实现,实例代码以下:
下面用协程下载一样的20个网页,实例代码以下:
能够发现,协程的效率也是很是高的。
下面分别使用线程池、进程池和协程池下载100个相同的网页,来对比其效率:
从结果来看,使用协程池的效率仍是略高一点。
做者:m2fox
连接:https://www.jianshu.com/p/857e0780946b