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运算符重载用法实例分析
Jun 01 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
python使用logging模块发送邮件代码示例
Jan 18 Python
python pandas dataframe 行列选择,切片操作方法
Apr 10 Python
Python登录注册验证功能实现
Jun 18 Python
Python3.5内置模块之random模块用法实例分析
Apr 26 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
详解python实现交叉验证法与留出法
Jul 11 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
详解python中groupby函数通俗易懂
May 14 Python
Python内置异常类型全面汇总
May 28 Python
python 调用Google翻译接口的方法
Dec 09 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生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
Vue.js仿Select下拉框效果
2020/02/18 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python的print用法示例
2014/02/11 Python
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
电子信息毕业生自荐信
2013/11/16 职场文书
大学本科毕业生求职信范文
2013/12/18 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
村创先争优活动总结
2014/08/28 职场文书
英语感谢信范文
2015/01/20 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
解决Oracle数据库用户密码过期
2022/05/11 Oracle