python3爬虫中多线程的优势总结


Posted in Python onNovember 24, 2020

有些小伙伴跟小编讨论了python中使用多线程原理的问题,就聊到了关于python多线程的弊端问题,这点可能在使用的过程中大家会能感觉到。而且之前讲过的GIL也是对python多线程的一种限制。那么,我们为什么还要用多线程呢?当然是多线程的优势已经掩盖了它本身不足之处,所以我们来加强一下学习python多线程的信心吧~

总结起来,使用多线程编程具有如下几个优点:

进程之间不能共享内存,但线程之间共享内存非常容易。

操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此,使用多线程来实现多任务并发执行比使用多进程的效率高。

Python 语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了 Python 的多线程编程。

threading模块

普通创建方式

import threading
import time
def run(n):
  print("task", n)
  time.sleep(1)
  print('2s')
  time.sleep(1)
  print('1s')
  time.sleep(1)
  print('0s')
  time.sleep(1)
if __name__ == '__main__':
  t1 = threading.Thread(target=run, args=("t1",))
  t2 = threading.Thread(target=run, args=("t2",))
  t1.start()
  t2.start()
----------------------------------
>>> task t1
>>> task t2
>>> 2s
>>> 2s
>>> 1s
>>> 1s
>>> 0s
>>> 0s

守护线程

我们看下面这个例子,这里使用setDaemon(True)把所有的子线程都变成了主线程的守护线程,因此当主进程结束后,子线程也会随之结束。所以当主线程结束后,整个程序就退出了。

import threading
import time
def run(n):
  print("task", n)
  time.sleep(1)    #此时子线程停1s
  print('3')
  time.sleep(1)
  print('2')
  time.sleep(1)
  print('1')
if __name__ == '__main__':
  t = threading.Thread(target=run, args=("t1",))
  t.setDaemon(True)  #把子进程设置为守护线程,必须在start()之前设置
  t.start()
  print("end")
----------------------------------
>>> task t1
>>> end

我们可以发现,设置守护线程之后,当主线程结束时,子线程也将立即结束,不再执行。

python多线程实例代码:

1个线程时:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/3.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/4.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/6.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/8.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html 
Done, Time cost: 8.182249069213867

2个线程时:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/4.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/8.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html 
Done, Time cost: 4.0987958908081055

到此这篇关于python3爬虫中多线程的优势总结的文章就介绍到这了,更多相关python3爬虫中多线程的优势有哪些内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用Python给文本创立向量空间模型的教程
Apr 23 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 Python
Python3接口性能测试实例代码
Jun 20 Python
详解python的异常捕获
Mar 03 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 #Python
python 如何停止一个死循环的线程
Nov 24 #Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 #Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 #Python
Python调用Redis的示例代码
Nov 24 #Python
基于django和dropzone.js实现上传文件
Nov 24 #Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 #Python
You might like
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
Django 开发环境配置过程详解
2019/07/18 Python
python实现单链表的方法示例
2019/09/03 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
环境科学专业个人求职信
2013/12/15 职场文书
上班离岗检讨书
2014/09/10 职场文书
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python