• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
龙泗水
博客园    首页    新随笔    联系   管理    订阅  订阅

基于python的进程、线程、协程理解

为什么要引入并发编程?

场景1:一个网络爬虫,按顺序爬取花了1小时,采用并发下载可以减少到20分钟。
场景2:一个app应用,优化前每次打开页面需要3秒,采用异步并发提升到每次200毫秒。

引入并发,就是为了提升程序运行速度。

  • 单线程串行 - 单线程异步IO- 多线程并发 - 多CPU并行 - 多机器并行
  • normal - asynio - threading - multiprocessing - hadoop/hive/spark

Python对并发编程的支持

  • 多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成。(待定) 暂定就是并行
    修订:线程概念和进程概念类似,只是在资源共享上的概念有所不同。 可以理解为线程的资源大小是变化的,而进程的资源大小是固定的,线程越多,每一个线程
    资源越少,在没有利用到cpu和io可以同时执行且资源不变的情况下达到提高想要的“效率”的目的。

  • 多进程:multiprocessing,利用多核CPU的能力,并行执行任务。(其中每个CPU也有可能会设计成多线程) 暂定就是并行

  • 异步IO:asynio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行 暂定就是并发
    修订:利用CPU和IO同时执行的原理,暂时把IO执行当作等待,(协程其实是CPU资源?IO概念不清楚,内存和硬盘的交互,和CPU无关?)那么我们就可以执行
    计算,然后切换再执行计算,不用被阻塞需要等IO结束才能执行下一步操作。

  • 使用Lock对资源加锁,防止冲突访问。这在异步当中很常见,因为函数执行的顺序不再是顺序的,他可能先执行后面的内容,再执行前面的内容,
    可能会读取一个没有来得及修改的值,比如余额,造成逻辑错误。(类比条件竞争)和sql中的事物是一样的概念。

  • 使用Queue实现不同线程/进程之间的数据通信。

  • 可以使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待提取、获取结果。

  • 使用subprocess启动外部程序的进程,并进行输入输出交互。

cpu和io

可以并发运行的条件:
1.有其他资源充盈
2.有阻塞情况发生


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

Python并发编程有3种模式:
多线程Thread、多进程Process、多协程Coroutine

  1. 什么是CPU密集型计算、IO密集型计算?
  2. 多线程、多进程、多协程的对比

CPU-bound
I/O在很短的事件就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高。
例如:压缩解压缩、加密解密、正则表达式搜索

I/O-bound
IO密集型指的是系统运行大部分的状况是CPU在等I/O(硬盘/内存)的读/写操作,CPU占用率仍然较低。
例如:文件处理程序、网络爬虫程序(网络下载、上传)、读写数据库程序

多进程 Process(multiprocessing) -- 一个进程中可以启动N个线程

  • 优点:利用多核CPU并行运算
  • 缺点:占用资源最多、可启动数目比线程少(我感觉是不是他的意思是,因为占用资源多,资源有限,所以可启动数目少?)
  • 适用于:CPU密集型计算

多线程 Thread(threading) -- 一个线程中可以启动N个协程

  • 优点:相比进程,更轻量级、占用资源少
  • 缺点:
    • 相比进程:多线程只能并发执行,不能利用多CPU(GIL)(单看多线程)(对于python多线程是真的只能使用一个cpu,而我觉得应该是对于thread库)
    • 相比协程:启动数目有限制,占用内存资源,有线程切换开销。
  • 适用于:IO密集型计算、同时运行的任务数目要求不多

多协程 Coroutine(asyncio)

  • 优点:内存开销最少、启动协程数量最多(能够到达几万个)
  • 缺点:支持的库有限制(aiohttp vs requests)、代码实现复杂
  • 适用于:IO密集型计算、需要超多任务运行、但有现成协程库支持的场景 (说的其实很抽象,其实理解原理就大概知道他们的使用场景了)

并行 和 并发
计算机术语赋予他们的概念。
并行就是一起执行
并发是可以来回切换,但每一时刻只执行一样东西。

极好的文章
线程和协程的区别


都是个人理解,如有不足请指出,十分感谢。

posted @ 2022-03-16 22:52  龙泗水  阅读(97)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3