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版
Dec 07 Python
Python中的jquery PyQuery库使用小结
May 13 Python
复习Python中的字符串知识点
Apr 14 Python
python xml解析实例详解
Nov 14 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
深入分析python中整型不会溢出问题
Jun 18 Python
python实现ID3决策树算法
Aug 29 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
使用openCV去除文字中乱入的线条实例
Jun 02 Python
Python如何将将模块分割成多个文件
Aug 04 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中exec函数和shell_exec函数的区别
2014/08/20 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
js读写json文件实例代码
2014/10/21 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
深入理解vue Render函数
2017/07/19 Javascript
js模块加载方式浅析
2017/08/12 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
python得到单词模式的示例
2018/10/15 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
学员自我鉴定
2014/03/19 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
起诉书范文
2015/05/20 职场文书
详解Python中下划线的5种含义
2021/07/15 Python