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中的pprint折腾记
Jan 21 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
Python编写登陆接口的方法
Jul 10 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
Python实现的堆排序算法示例
Apr 29 Python
详解flask入门模板引擎
Jul 18 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
Python3远程监控程序的实现方法
Jul 15 Python
使用keras根据层名称来初始化网络
May 21 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
python中slice参数过长的处理方法及实例
Dec 15 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
用Python进行行为驱动开发的入门教程
2015/04/23 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
python实现报表自动化详解
2017/11/16 Python
Python通过属性手段实现只允许调用一次的示例讲解
2018/04/21 Python
Python IDLE清空窗口的实例
2018/06/25 Python
详解Django中间件执行顺序
2018/07/16 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
电气自动化专业职业规划范文
2014/02/16 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
干部考察材料范文
2014/12/24 职场文书
小学推普周活动总结
2015/05/07 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js