大家好,我是早起。

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 多线程指南!相关推荐

  1. 人人都能学会的python编程教程(基础篇)完整版

    人人都能学会的python编程教程1:第一行代码 人人都能学会的python编程教程2:数据类型和变量 人人都能学会的python编程教程3:字符串和编码 人人都能学会的python编程教程4:关系运 ...

  2. 人人都能学会的python编程教程1:第一行代码

    前言 众所周知,现在IT行业很火,行业薪酬也很高,国家在2017年也发布了人工智能教育的推广计划,人人会编程的时代将要到来.不会编程.不懂编程可能有些跟不上时代的节奏,普通人不懂技术也许会觉得这个很难 ...

  3. python是人都能学会_人人都能学会的python编程教程15:高级特性2

    生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题 ...

  4. 人人都能学会的python编程教程3:字符串和编码

    字符串 在python3中已经全面支持中文. 由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码.当Python解释器读取源 ...

  5. 人人都能学会的python编程教程15:高级特性2

    生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题 ...

  6. 人人都能学会的python编程教程11:定义函数

    定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_ ...

  7. 人人都能学会的python编程教程14:高级特性1

    切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 第一个元素的索引 ...

  8. python选课系统_【精选】在Monash读Data Science,人人都拥有这样一份选课指南。

    点击上方"蓝字",关注最适合你的学习咨询 前言 1.课程难度因人而异,课程作业也可能每学期变动,所以大家结合个人实际情况参考借鉴. 2.本指南系列只描述了比较最主流的课,冷门课程资 ...

  9. 我的憨憨女友都能看懂学会的python多线程

    我和我的女朋友因为python而相识,同时也是因为python我才能把憨憨追到手.最近我和我女朋友在做一个项目,我负责语音识别和TTS,她负责QT界面设计.终于在上一个周我们都完成了各自预期的功能.到 ...

最新文章

  1. nginx反向代理vue访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
  2. JavaScript程序员必备的5个debug技巧
  3. 良性计算机病毒对计算有没有危害机系统,154、计算机病毒有良性和恶性之分,其中, – 手机爱问...
  4. 分享自己作为一个程序员的找工作经历
  5. 全能王PDF转换器 V2.0.0.2
  6. 高新园区到大连计算机学校,教育局 | 高新园区2018指标分配表及大连各区指标到校表(附:现行大连指标名额分配方案)...
  7. Linux服务器Java进程突然消失排查办法
  8. python xlwt操作excel
  9. jsoup教程_3 Jsoup 讲解
  10. centos7 python2换成python3后,yum报错解决
  11. Python爬取小说网站页面制作电子书
  12. FastAdmin 目录权限设置
  13. 202. 快乐数 (Python 实现)
  14. ecshop模板支持php,解决ecshop模板不支持php代码,修改ecshop过滤模板php代码!
  15. 从网易博客转入CSDN
  16. java实现清除图片水印_Java 添加、删除PPT文本和图片水印
  17. linux系统外接硬盘_电脑主硬盘linux系统,外接硬盘win7系统.如何启动外接硬盘的win7系统?...
  18. Excel中如何快速汇总带单位的数据
  19. 【SSL_2020.10.27】小biu闯关
  20. ionic loading(加载动作)

热门文章

  1. 响应式布局html像素值计算,CSS Calc():制作响应式网格布局的锋利武器
  2. java中以json形式的打印
  3. Nginx反向代理,负载均衡,redis session共享,keepalived高可用
  4. sublime xdebug调试php
  5. Linux下安装Redis并添加PHP扩展(自己测试了没有问题)
  6. matlab实现音频信号的左右声道信号分离_立体声分离度与立体声相关系数
  7. mysql源码启动_Mysql源码安装、配置、初始化及启动
  8. oracle undo 缩小,缩小Oracle的系统表空间(SYSTEM、TEMP、UNDOTBS1、SYSAUX)
  9. vecm模型怎么写系数_用Stata搞实证之面板模型入门
  10. java arm 编译器下载_最全盘点:18款在线C/C++/Py/Java编译器,一个比一个强大(附地址)...