人人都能学会的 Python 多线程指南!
大家好,我是早起。
在 Python
中,多线程最常见的一个场景就是爬虫,例如这样一个需求,有多个结构一样的页面需要爬取,例如下方的URL(豆瓣阿凡达影评,以10个为例)
url_list = ['https://movie.douban.com/subject/1652587/reviews?sort=time&start=0','https://movie.douban.com/subject/1652587/reviews?sort=time&start=20','https://movie.douban.com/subject/1652587/reviews?sort=time&start=40','https://movie.douban.com/subject/1652587/reviews?sort=time&start=60','https://movie.douban.com/subject/1652587/reviews?sort=time&start=80','https://movie.douban.com/subject/1652587/reviews?sort=time&start=100','https://movie.douban.com/subject/1652587/reviews?sort=time&start=120','https://movie.douban.com/subject/1652587/reviews?sort=time&start=140','https://movie.douban.com/subject/1652587/reviews?sort=time&start=160','https://movie.douban.com/subject/1652587/reviews?sort=time&start=180']
如果依次爬取,请求第一个页面——得到返回数据——解析数据——提取、存储数据——请求第二个页面,按照这样的思路,那么大量时间都会浪费在请求、返回数据上,如果在等待第一个页面返回数据时去请求第二个页面,就能有效的提高效率,多线程就可以实现这样的功能。
在Python中实现多线程的方法也很多,我将基于 threading
模块一点一点介绍,注意本文不会太注重于多线程背后的技术概念(面试常问),仅希望用最少的话教会大家如何实现。当然会在最后介绍如何使用threading
模块来解决上面的爬虫问题。
threading基本使用
让我们先从一个简单的例子开始,定义do_something
函数,执行该函数需要消耗1秒
import timestart = time.perf_counter()def do_something():print("-> 线程启动")time.sleep(1)print("-> 线程结束")do_something()finish = time.perf_counter()print(f"全部任务执行完成,耗时 {round(finish - start,2)} 秒")
上面的代码不难理解,执行do_something
并计算耗时,结果很明显应该是1s
-> 线程启动
-> 线程结束
全部任务执行完成,耗时 1.01 秒
现在如果需要执行两次do_something
,按照最基本的思路
import timestart = time.perf_counter()def do_something():print("-> 线程启动")time.sleep(1)print("-> 线程结束")do_something()
do_something()finish = time.perf_counter()print(f"全部任务执行完成,耗时 {round(finish - start,2)} 秒")
执行上面代码结果也很容易猜到是2秒
-> 线程启动
-> 线程结束
-> 线程启动
-> 线程结束
全部任务执行完成,耗时 2.01 秒
这就是最常规的 同步 思路,在CPU执行第一个函数,也就是等待1s的时间内,什么也不干,等第一个函数执行完毕后再执行第二个函数
很明显,这样让CPU干等着啥也不干并不是一个很好的选择,而多线程就是解决这一问题的方法之一,让CPU在等待某个任务完成时去执行更多的操作,将整个过程简化为下图流程,这样就能充分节省时间
现在使用threading
来通过多线程的方式实现上面的过程,非常简单,定义两个线程并依次启动即可
人人都能学会的 Python 多线程指南!相关推荐
- 人人都能学会的python编程教程(基础篇)完整版
人人都能学会的python编程教程1:第一行代码 人人都能学会的python编程教程2:数据类型和变量 人人都能学会的python编程教程3:字符串和编码 人人都能学会的python编程教程4:关系运 ...
- 人人都能学会的python编程教程1:第一行代码
前言 众所周知,现在IT行业很火,行业薪酬也很高,国家在2017年也发布了人工智能教育的推广计划,人人会编程的时代将要到来.不会编程.不懂编程可能有些跟不上时代的节奏,普通人不懂技术也许会觉得这个很难 ...
- python是人都能学会_人人都能学会的python编程教程15:高级特性2
生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题 ...
- 人人都能学会的python编程教程3:字符串和编码
字符串 在python3中已经全面支持中文. 由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码.当Python解释器读取源 ...
- 人人都能学会的python编程教程15:高级特性2
生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题 ...
- 人人都能学会的python编程教程11:定义函数
定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_ ...
- 人人都能学会的python编程教程14:高级特性1
切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 第一个元素的索引 ...
- python选课系统_【精选】在Monash读Data Science,人人都拥有这样一份选课指南。
点击上方"蓝字",关注最适合你的学习咨询 前言 1.课程难度因人而异,课程作业也可能每学期变动,所以大家结合个人实际情况参考借鉴. 2.本指南系列只描述了比较最主流的课,冷门课程资 ...
- 我的憨憨女友都能看懂学会的python多线程
我和我的女朋友因为python而相识,同时也是因为python我才能把憨憨追到手.最近我和我女朋友在做一个项目,我负责语音识别和TTS,她负责QT界面设计.终于在上一个周我们都完成了各自预期的功能.到 ...
最新文章
- nginx反向代理vue访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
- JavaScript程序员必备的5个debug技巧
- 良性计算机病毒对计算有没有危害机系统,154、计算机病毒有良性和恶性之分,其中, – 手机爱问...
- 分享自己作为一个程序员的找工作经历
- 全能王PDF转换器 V2.0.0.2
- 高新园区到大连计算机学校,教育局 | 高新园区2018指标分配表及大连各区指标到校表(附:现行大连指标名额分配方案)...
- Linux服务器Java进程突然消失排查办法
- python xlwt操作excel
- jsoup教程_3 Jsoup 讲解
- centos7 python2换成python3后,yum报错解决
- Python爬取小说网站页面制作电子书
- FastAdmin 目录权限设置
- 202. 快乐数 (Python 实现)
- ecshop模板支持php,解决ecshop模板不支持php代码,修改ecshop过滤模板php代码!
- 从网易博客转入CSDN
- java实现清除图片水印_Java 添加、删除PPT文本和图片水印
- linux系统外接硬盘_电脑主硬盘linux系统,外接硬盘win7系统.如何启动外接硬盘的win7系统?...
- Excel中如何快速汇总带单位的数据
- 【SSL_2020.10.27】小biu闯关
- ionic loading(加载动作)
热门文章
- 响应式布局html像素值计算,CSS Calc():制作响应式网格布局的锋利武器
- java中以json形式的打印
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
- sublime xdebug调试php
- Linux下安装Redis并添加PHP扩展(自己测试了没有问题)
- matlab实现音频信号的左右声道信号分离_立体声分离度与立体声相关系数
- mysql源码启动_Mysql源码安装、配置、初始化及启动
- oracle undo 缩小,缩小Oracle的系统表空间(SYSTEM、TEMP、UNDOTBS1、SYSAUX)
- vecm模型怎么写系数_用Stata搞实证之面板模型入门
- java arm 编译器下载_最全盘点:18款在线C/C++/Py/Java编译器,一个比一个强大(附地址)...