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中lambda的用法及其与def的区别解析
Jul 28 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
python3.5绘制随机漫步图
Aug 27 Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
python制作英语翻译小工具代码实例
Sep 09 Python
Django之全局使用request.user.username的实例详解
May 14 Python
Python pip安装模块提示错误解决方案
May 22 Python
python模块与C和C++动态库相互调用实现过程示例
Nov 02 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
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Python全局变量用法实例分析
2016/07/19 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
python3大文件解压和基本操作
2017/12/15 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
好军嫂事迹材料
2014/01/15 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL