python3爬虫中多线程的优势总结

有些小伙伴跟小编讨论了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爬虫中多线程的优势有哪些内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python3多线程爬虫实例讲解代码

    多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补.并且在Python3中废弃了thread模块,保留了更强大的threading模块. 使用场景 在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限

  • python3爬虫中多线程的优势总结

    有些小伙伴跟小编讨论了python中使用多线程原理的问题,就聊到了关于python多线程的弊端问题,这点可能在使用的过程中大家会能感觉到.而且之前讲过的GIL也是对python多线程的一种限制.那么,我们为什么还要用多线程呢?当然是多线程的优势已经掩盖了它本身不足之处,所以我们来加强一下学习python多线程的信心吧~ 总结起来,使用多线程编程具有如下几个优点: 进程之间不能共享内存,但线程之间共享内存非常容易. 操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多.因此

  • python3爬虫中多线程进行解锁操作实例

    生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开.同样的之间我们讲过多线程中的lock,作用是为了不让多个线程运行是出错所以进行锁住的指令.但是鉴于我们实际运用中,因为线程和指令不会只有一个,如果全部都进行lock操作就会出错.所以今天小编为大家进行lock的全面讲解,同时为大家带来lock的解锁方法. 由于线程之间随机调度,所以在使用共享变量时,某线程可能在执行n条后,CPU接着执行其他线程,很容易使得最终结果出错.为了多个线程同时操作一个内存中的资源

  • python3爬虫中异步协程的用法

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后导致其爬取效率是非常非常低的. 为了解决这类问题,本文就来探讨一下 Python 中异步协程来加速的方法,此种方法对于 IO 密集型任务非常有效.如将其应用到网络爬虫中,爬取效率甚至可以成百倍地提升. 注:本文协程使用 async/await 来实现,需要 Python 3.5 及以上版本. 2.

  • python爬虫中多线程的使用详解

    queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性. #多线程实战栗子(糗百) #用一个队列Queue对象, #先产生所有url,put进队列: #开启多线程,把q

  • Python3爬虫中关于中文分词的详解

    原理 中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词.表面上看,分词其实就是那么回事,但分词效果好不好对信息检索.实验结果还是有很大影响的,同时分词的背后其实是涉及各种各样的算法的. 中文分词与英文分词有很大的不同,对英文而言,一个单词就是一个词,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,需要人为切分.根据其特点,可以把分词算法分为四大类: ·基于规则的分词方法 ·基于统计的分词方法 ·基于语义的分词方法 ·基于理解

  • python3爬虫中引用Queue的实例讲解

    我们去一个受欢迎的地方买东西,难免会需要排队等待.如果有多个窗口的话,就会有不同队列的产生,当然每个队伍的人数也会出现参差不齐的现象.我们今天所要说的Queue就可以理解成生活中的排队现象.那么结合我们所要用的爬虫知识,应该怎么在Queue中应用呢?接下来就开始今天的内容学习: 队列这种东西大家应该都知道,就是一个先进先出的数据结构,而Python的标准库中提供了一个线程安全的队列,也就是说该模块是适用于多线程编程的先进先出(first-in,first-out,FIFO)数据结构,可以用来在生

  • Python3爬虫中Ajax的用法

    Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML.它不是一门编程语言,而是利用JavaScript在保证页面不被刷新.页面链接不改变的情况下与服务器交换数据并更新部分网页的技术. 对于传统的网页,如果想更新其内容,那么必须要刷新整个页面,但有了Ajax,便可以在页面不被全部刷新的情况下更新其内容.在这个过程中,页面实际上是在后台与服务器进行了数据交互,获取到数据之后,再利用JavaScript改变网页,这样网页内容就会更新了.

  • Python3爬虫中Selenium的用法详解

    Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击.下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬.对于一些JavaScript动态渲染的页面来说,此种抓取方式非常有效.本节中,就让我们来感受一下它的强大之处吧. 1. 准备工作 本节以Chrome为例来讲解Selenium的用法.在开始之前,请确保已经正确安装好了Chrome浏览器并配置好了ChromeDriver.另外,还需要正确安装好Python的Selenium库,详细的安装和配置过程

  • Python3爬虫中Splash的知识总结

    Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库.利用它,我们同样可以实现动态渲染页面的抓取. 1. 功能介绍 ·利用Splash,我们可以实现如下功能: ·异步方式处理多个网页渲染过程: ·获取渲染后的页面的源代码或截图: ·通过关闭图片渲染或者使用Adblock规则来加快页面渲染速度: ·可执行特定的JavaScript脚本: ·可通过Lua脚本来控制页面渲染过程: ·获取渲染的详细过程并通过HAR(

  • Python3爬虫中关于Ajax分析方法的总结

    这里还以前面的微博为例,我们知道拖动刷新的内容由Ajax加载,而且页面的URL没有变化,那么应该到哪里去查看这些Ajax请求呢? 1. 查看请求 这里还需要借助浏览器的开发者工具,下面以Chrome浏览器为例来介绍. 首先,用Chrome浏览器打开微博的链接https://m.weibo.cn/u/2830678474,随后在页面中点击鼠标右键,从弹出的快捷菜单中选择"检查"选项,此时便会弹出开发者工具,如图6-2所示: 此时在Elements选项卡中便会观察到网页的源代码,右侧便是节

随机推荐