【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行

视频地址:https://www.bilibili.com/video/BV1bK411A7tV/

P1 Python并发编程简介

提纲
Python并发编程简介 P1 - 00:13

并发编程的使用场景

关键词 异步并发
Python并发编程简介 P1 - 00:29

不同等级的程序提速方法
Python并发编程简介 P1 - 02:06


程串行 》 多线程并发》 多CPU(是指多核)并行 》 多机器并行

怎样用python实现不同的并发方式
Python并发编程简介 P1 - 04:35

P2怎样选择多线程多进程多协程

总览

多进程的数目是不是和cpu的核数绑定在一起的?
怎样选择多线程多进程多协程 P2 - 00:27
对三种实现方式的应用场景的介绍,以及三种方式的不同。



CPU bound 与IO bound
怎样选择多线程多进程多协程 P2 - 02:55

Process、Thread和Coroutine 对比
有级联关系
GIL
协程可以达到几万个
怎样选择多线程多进程多协程 P2 - 03:23

协程使用的是一个线程的资源

怎么选择对应的技术
怎样选择多线程多进程多协程 P2 - 07:35


如果任务没有协程库的支持,是不能使用协程来实现的。

P3 Python速度慢的罪魁祸首,全局解释器锁GIL

速度慢的两个原因
Python速度慢的罪魁祸首,全局解释… P3 - 00:51
随时检查数据类型,造成新的数度慢的原因

GIL
Python速度慢的罪魁祸首,全局解释… P3 - 02:08
解释器 当然是python的


为什么有GIL
Python速度慢的罪魁祸首,全局解释… P3 - 04:24

怎么规避GIL带来的限制
Python速度慢的罪魁祸首,全局解释… P3 - 07:21
用它来执行IO密集型

P4 使用多线程,Python爬虫被加速10倍

python 创建多线程的方法
创建函数,创建子线程
第4步不是必须的

代码
爬取博客园
使用多线程,Python爬虫被加速10倍 P4 - 02:36
创建一个模块,添加一个脚本

新的写法 f"str{}"

第一步的代码

注意怎么写多线程的代码的

只有一个元素的元组不加逗号就是字符串

使用多线程,Python爬虫被加速10倍 P4 - 05:34


运行并且计时

执行顺序的区别(多线程是无序的)

P5 Python实现生产者消费者爬虫;线程之间通过queue来交互的

多组件的Pipeline 技术架构
Python实现生产者消费者爬虫 P5 - 01:18

不同的模块叫处理器 叫processor

这种把事情分很多模块处理的架构叫Pipeline

生产者消费者爬虫的架构
Python实现生产者消费者爬虫 P5 - 01:52
好处是不同的人开发,为任务配置不同的系统资源(比如线程数)

消费者消费中间数据

这两个线程的交互数据是怎么来进行呢?

Python实现生产者消费者爬虫 P5 - 02:37

线程安全是指多个线程并发的同时访问的数据不会冲突

怎么使用queue?

q.put q.get 都是阻塞的,这是使用中方便的一点

代码实现
Python实现生产者消费者爬虫 P5 - 03:47
接着上节的代码

def parse(消费者)提取页面中的所有文章的标题和链接

结果

多线程下的生产者消费者 代码

Python实现生产者消费者爬虫 P5 - 06:48

do_craw (生产者)do_parse(消费者)

fout 文件对象

中间数据的处理 sleep 和log

怎么通过多线程调度起来呢?

Python实现生产者消费者爬虫 P5 - 10:55

准备两个queue用于队列的交互

对url_queue 需要进行初始化,因为是整个pipeline的输入数据

启动生产者线程 并且加两个消费者线程

最后这个程序是卡住了,因为while True 会等待里面的线程

查看结果 data.txt

总结
Python实现生产者消费者爬虫 P5 - 14:02
对于复杂的爬虫可以分很多的模块,每个模块都可以起不同的线程组去处理;不同的线程组之间通过queue.Queue来交互的,通过queue.queue, 主线程把数据扔进去 ,然后把queue传给生产者,生产者会产出中间数据,然后消费者线程对中间数据处理,产出最终数据

P6线程安全问题,以及解决该问题的lock模块


提纲
Python线程安全问题以及解决方案 P6 - 00:22

线程安全是什么
Python线程安全问题以及解决方案 P6 - 00:31

解决方法 LOCk
Python线程安全问题以及解决方案 P6 - 03:29

左边是简写
这是又变成单线程了吗?

代码演示
Python线程安全问题以及解决方案 P6 - 04:29

结果

加time.sleep(0.1) 一定会导致线程不安全,因为time.sleep()一定会导致线程阻塞导致线程切换

修改
Python线程安全问题以及解决方案 P6 - 08:45

P7 好用的线程池ThreadPollExecutor


大纲
Python好用的线程池ThreadPoolExecutor P7 - 00:17

线程池的原理
Python好用的线程池ThreadPoolExecutor P7 - 00:37

五个状态相互流转

线程池怎么流转

通过一个任务队列以及一个可重用的线程就实现了一个线程池

好处和使用场景
Python好用的线程池ThreadPoolExecutor P7 - 02:46

怎么使用?
Python好用的线程池ThreadPoolExecutor P7 - 03:47
futures 是什么时候运行的呢,是futures 初始化的时候,还是遍历future的时候?

在自己创建线程里获取结果是很麻烦的,只能通过queue

as_completed 那个先执行完就返回

代码
Python好用的线程池ThreadPoolExecutor P7 - 06:10

使用map 来改造craw和parse

执行结果是按照顺序的

转为 as_completed

总结
Python好用的线程池ThreadPoolExecutor P7 - 11:44

pool 虽然简洁 不能随时提交任务,需要随时把参数准备好, 返回也是按顺序返回的

as_completed 随时提交任务,先结束先返回

P8 Python使用线程池在Web服务中实现加速

提纲
Python使用线程池在Web服务中实现加速 P8 - 00:18

web服务的架构和特点

Python使用线程池在Web服务中实现加速 P8 - 00:43

第3点就暗示了不能无限的启动线程

使用线程池来加速
Python使用线程池在Web服务中实现加速 P8 - 02:15

代码
Python使用线程池在Web服务中实现加速 P8 - 02:53

加个方法

万能键创建方法

加起来是600多毫秒 postman 测试时间
怎么加速呢?
Python使用线程池在Web服务中实现加速 P8 - 06:25

sleep 体现IO

初始化一个全局的pool, 方法内分别创建是有问题的


重新运行,时间变成了0.318 是原来的一半, 是最长时间

P9 从多线程切换到多进程

使用多进程multiprocessing模块加速程序的运行 P9 - 00:05

提纲
使用多进程multiprocessing模块加速程序的运行 P9 - 00:19

有了多线程,为什么还要多进程呢
使用多进程multiprocessing模块加速程序的运行 P9 - 00:50

是多进程,系统中运行了多个python 解释器, 他们真正的只并行计算, 但是也相应的会有一些负担

怎么使用呢 语法

使用多进程multiprocessing模块加速程序的运行 P9 - 02:18

多进程的知识梳理(多进程和多线程几乎一样,这也是设计者为了让使用者无缝切换)

单线程 多线程, 多进程对CPU密集型计算速度对比
使用多进程multiprocessing模块加速程序的运行 P9 - 04:57

代码
使用多进程multiprocessing模块加速程序的运行 P9 - 06:02
没有涉及到IO
线性塞?

新写法 [1, 2, …] * 100

不同执行方式

结果 听风扇

总结
使用多进程multiprocessing模块加速程序的运行 P9 - 10:47

P10 异步IO (引入协程)

Python异步IO实现并发爬虫 P11 - 00:02

引入协程

异步IO库 asyncio
Python异步IO实现并发爬虫 P11 - 03:08

await 声明IO

awiat 的时候不能阻塞, 不然单线程就不能并发执行了(协程是线程内的,线程阻塞了,这个协程当然也就阻塞了)

代码
Python异步IO实现并发爬虫 P11 - 05:18
定义异步对象
协程就是在异步IO 里执行的这个函数,函数与普通函数的不同就是这个函数是接受超级循环来调度的

获取超级循环 loop
对每个url创建一个针对的task(使用协程函数定义task)

结果

如果任务要一个一个加入该怎么办呢?

对比
Python异步IO实现并发爬虫 P11 - 09:47

单线程异步大部分情况下是快于多线程的(因为多线程并发切换是花费时间的, 单线程异步没有切换的开销)

需要有线程库的支持

P11在异步IO中使用信号量控制爬虫并发度

什么是信号量 以及使用语法
在异步IO中使用信号量控制爬虫并… P12 - 00:21
是一个计数器,数值可以对并发度的限制,当一个线程进去,数值减一

总量限制在10 以内?

代码

改造上面的异步IO的代码,加入并发量
在异步IO中使用信号量控制爬虫并… P12 - 03:08

初始化信号量 seaphore 10 是并发度

结果

发现10个任务后会暂停一会

P12使用subprocess调用外部程序

Python使用subprocess播放歌曲解压文件 P13 - 00:01
视频源不见了,标记失效

subprocess介绍

实例

定义对象,执行对象

代码
Python使用subprocess播放歌曲解压文件 P13 - 02:44
视频源不见了,标记失效

【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行相关推荐

  1. python:一文搞懂多线程,多进程,异步协程的使用场景

    本文将使用场景化为案例,将单线程,多线程,多进程,异步协程的速度进行对比 对比速度时,   >表示 速度快于  >>表示速度远快于  =表示速度差不多 >>>> ...

  2. Python并发编程系列之多线程

    1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...

  3. Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)

    文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...

  4. python并发编程书籍推荐_《吐血整理》-顶级程序员书单集

    <程序人生>十年风雨技术人的书单整理 前言 王潇:格局决定了一个人的梦想,梦想反过来决定行为. 那格局是什么呢? 格局是你能够看见的深度.广度和密度. 王潇认为,格局是一本本书搭建起来的, ...

  5. Python 并发编程之使用多线程和多处理器

    在Python编码中我们经常讨论的一个方面就是如何优化模拟执行的性能.尽管在考虑量化代码时NumPy.SciPy和pandas在这方面已然非常有用,但在构建事件驱动系统时我们无法有效地使用这些工具.有 ...

  6. python多线程调度_python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 进程.线程的调度策略介绍 linux中的进程主要有三种调度策略: 优先级调度:将进程分为普通进程和实时进程: 先进先出(队列)调度:实时进程先创建的先 ...

  7. 并发编程(进程、线程、协程)

    操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节, ...

  8. Python中多线程多进程与协程的区别

    进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大. 线程: 调度执行的最小单位,也叫执行路径,不能 ...

  9. python多线程多进程多协程_python 多进程、多线程、协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

最新文章

  1. kint 一个强大的php调试助手
  2. java51游戏_Java作业实践(一)魔板游戏
  3. 2022年美国大学生数学建模竞赛——Problem A:自行车手的功率剖面
  4. 2019年了,C#发展的怎么样了呢?
  5. 让服务器突破性能极限 阿里云神龙论文入选计算机顶会ASPLOS
  6. 终极神器盘点的FreeEIM
  7. flowable 中文文档_取出word文档文字内容生成加了目录、标号和页码的PDF文件
  8. 我看《Linux0.11内核完全注释2.01》的方法
  9. zookeeper 四字命令的使用
  10. python抓取图片_Python3简单爬虫抓取网页图片
  11. windows 安装jenkins
  12. 第十届全国社会媒体处理大会 (SMP 2021) 征文通知
  13. C#版 Tag云图控件
  14. 我们为什么要骑驴找马?
  15. mysql Events及存储过程查看
  16. 20吉大计算机/软件考研经验贴!
  17. Python 饼图
  18. Linux安装Elasticsearch和Kibana
  19. StarUML使用说明—用例图、时序图、活动图
  20. 倍福PLC在NC轴报错代码18000原因分析

热门文章

  1. 中鑫吉鼎|家庭理财规划具体有哪些步骤
  2. EDIUS中的3D图层效果该如何制作
  3. mysql(v5.*)创建数据库用户并授权
  4. mysql double 索引_MySQL架构优化实战系列1:数据类型与索引调优全解析
  5. python制作3d相册代码_Python使用matplotlib绘制3D图形(代码示例)
  6. 已修复最新固件问题Surface Pro 6 安装黑苹果15.6 完美版,触控板、显卡、声音、USBWiFi驱动,一步到位懒人必备--(原创)杨泽鹏
  7. 40岁就该下岗?IBM涉嫌年龄歧视,称其老员工为“恐龙”并计划辞退,员工竟无法反驳
  8. 手机app直播源码开发搭建
  9. Android 6.0手机存储图片以及下载apk需要申请动态权限
  10. div可编辑,contenteditable 属性