zoukankan      html  css  js  c++  java
  • python爬虫13 | 秒爬,这多线程爬取速度也太猛了,这次就是要让你的爬虫效率杠杠的

     

    快了

     

     

     

     

     

    小老弟

     

    想啥呢

     

     

    今天这篇爬虫教程的主题就是一个字

     

     

    想要做到秒爬

     

    就需要知道

     

    什么是多进程

     

    什么是多线程

     

    什么是协程(微线程)

     

    你先去沏杯茶

     

    坐下来

     

    小帅b这就好好给你说道说道

     

    关于线程这玩意

     

    沏好茶了吗

     

    那么

     

    接下来就是

     

    学习 python 的正确姿势

     

     

     

    首先我们来了解什么是进程

     

    进程就是正在运行的程序

     

    比如你的系统现在运行着的微信

     

    就是一个进程

     

    一旦你的「微信」运行起来

     

    系统就会给「微信」分配了内存和资源

     

    那什么是单进程呢?

     

    单进程就是说你的电脑只能做一件事情

     

    比如

     

    你在电脑打开了微信

     

    就不能再去打开淘宝了

     

     

    但是你会发现

     

    现在你的电脑

     

    很是牛逼

     

    可以一边看片一边听歌

     

    可以一边玩游戏一边撸代码

     

    这就是多进程

     

    你的电脑

     

    在同一段时间里面

     

    可以 “同时” 执行多个任务

     

    这样是不是提高了你家 CPU 的使用率了呢

     

    其实

     

    一个单核的 CPU 在一个时间点上只能运行一个程序

     

    之所以你能感觉到你电脑上的程序在同时运行

     

    是因为

     

    CPU 在做着切换

     

    因为 CPU 的切换速度超级快

     

     

    快到让你感觉到

     

    你开着的所有程序好像是在同时运行

     

     

    知道了什么是进程之后

     

    我们再来谈谈线程

     

    在一个进程里面

     

    可以执行多个任务

     

    在这里的每一个任务就是线程

     

    线程可以说是程序用 CPU 的一个基本单元

     

    所以

     

    一个程序里面如果只是单一的一个执行路径

     

    那么它就是单线程的

     

    一个程序如果有多个执行路径

     

    那么它就是多线程的

     

    所以你想要让你的爬虫高效

     

    就可以让你的爬虫实现多线程

     

    这样它就可以有更加高的几率抢到 CPU 的执行权

     

     

    每当小帅b跟别人吹线程的时候

     

    还会说到并行并发

     

    我们刚刚说了

     

    一个单核的 CPU

     

    它每次只能执行一个进程

     

    那么如果是多核的 CPU 呢

     

    是不是就可以同时执行多个进程了

     

    这就是并行

     

    在某一个时间段里,可以同时执行多个进程

     

    而并发呢

     

    就是在一个时间点,同时执行多个进程

     

    你想想

     

    在双十一的时候

     

    是不是在那个晚上的 12 点

     

    很多人同时秒杀了某一个商品

     

    这就是并发

     

     

    在系统里面

     

    进程和进程之间是互相独立的

     

    而一个进程里面的多个线程

     

    这些线程之间是共享一个进程空间的

     

    这个时候

     

    线程就要搞事情了

     

    毕竟一块蛋糕被共享

     

    谁都想多分一点

     

    就挤破头的想要抢占多一点资源

     

    哇靠啊

     

    这可不行啊

     

    这样数据就不安全了

     

    所以就有了互斥锁

     

    所谓互斥锁

     

    就是让线程乖一点

     

    别他妈的乱来

     

    一个一个线程安全有序的去执行

     

     

     

    在 python 里呢

     

    有一个叫做 GIL

     

    这个锁是干嘛的呢

     

    它就是用来控制线程执行权限的

     

    所以当一个线程需要执行的时候

     

    要先获得 GIL 之后才可以执行

     

    这样就不会产生线程安全问题

     

    但有一个问题是

     

    那他妈的还多线程个毛啊?

     

    恩..有一点是

     

    在 I/O 流阻塞的时候,GIL会被释放

    (I/O流就是输入输出流,如果你此刻不太理解这个概念也没关系)

     

     

     

    所以呀

     

    我们的 Python 程序

     

    如果是要处理多任务,想要充分的去利用我们多核的CPU

     

    就开启多进程(multiprocessing)

     

    而对于一些输入输出的多任务

     

    就开启多线程(threading.Thread、multiprocessing.dummy)

     

     

    哦对了

     

    还有一个玩意叫做协程

     

    协程也叫做微线程

     

    在一个线程里面可以执行多个函数

     

    线程和进程是通过系统调度的

     

    而微线程则不需要,可以根据需要自己调度

     

    因为微线程是函数之间在切换

     

    所以开销很小

     

    在 python 中使用微线程时一般会用到 genvent、monkey.patch_all

     

     

     

    本篇就到这里

     

    主要让你理解这几个概念

     

    下一篇

     

     小帅b就会使用多进程、多线程、协程的方式来实现 python 的爬虫

     

    敬请

     

     

     

    近期文章

     

    python爬虫12 | 爸爸,他使坏,用动态的 Json 数据,我要怎么搞?

     

    python爬虫11 | 这次,将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们

     

     

    扫一扫

    学习 Python 没烦恼

     

     

     

     

          点个好看啊~~(破音)

  • 相关阅读:
    Linux 的文件软链接如何删除
    mysql-xtrabackup备份sh: xtrabackup_56: command not found与error while loading shared libraries: libssl.so.6: cannot open shared object file: No such file or directory
    How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)
    [trouble] error connecting to master 'repl@192.168.1.107:3306'
    Troubleshooting 10g and 11.1 Clusterware Reboots (文档 ID 265769.1)
    "Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs
    RMAN-06900 RMAN-06901 ORA-19921
    一则ORACLE进程都在但是无法进入实例的问题
    VirtualBox下Win7下CPU高占用的一次故障解决
    netcore之mysql中文乱码问题解决记录
  • 原文地址:https://www.cnblogs.com/fxxkpython/p/10832203.html
Copyright © 2011-2022 走看看