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 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
探寻python多线程ctrl+c退出问题解决方案
Oct 23 Python
跟老齐学Python之折腾一下目录
Oct 24 Python
Python部署web开发程序的几种方法
May 05 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
关于tf.reverse_sequence()简述
Jan 20 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
python获取百度热榜链接的实例方法
Aug 25 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
JS 控件事件小结
2012/10/31 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
python 捕获shell脚本的输出结果实例
2017/01/04 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
python 实现表情识别
2020/11/21 Python
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
为数据库创建索引都需要注意些什么
2012/07/17 面试题
会计专业的自荐信
2013/12/12 职场文书
中班中秋节活动反思
2014/02/18 职场文书
防震减灾主题班会
2015/08/14 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
导游词之天津盘山
2019/11/01 职场文书
Redis高并发缓存架构性能优化
2022/05/15 Redis
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript