并发编程(二)怎样选择多线程多进程和多协程

并发编程专栏系列博客

并发编程(一)python并发编程简介

并发编程(二)怎样选择多线程多进程和多协程

并发编程(三)Python编程慢的罪魁祸首。全局解释器锁GIL

并发编程(四)如何使用多线程,使用多线程对爬虫程序进行修改及比较

并发编程(五)python实现生产者消费者模式多线程爬虫

并发编程(六)线程安全问题以及lock解决方案

并发编程(七)好用的线程池ThreadPoolExecutor

并发编程(八)在web服务中使用线程池加速

并发编程(九)使用多进程multiprocessing加速程序运行

并发编程(十)在Flask服务中使用进程池加速

并发编程(十一)python异步IO实现并发编程

并发编程(十二)使用subprocess启动电脑任意程序(听歌、解压缩、自动下载等等)

 
 

  • python并发编程的三种方式:
    • 多线程Thread

    • 多进程Process

    • 多协程Coroutine

  • CPU密集型计算、IO密集型计算
  • 在了解以上三者对比之前,我们先来了解一下什么是CPU密集型计算、IO密集型计算

    • CPU密集型计算(CPU-bound):

      • CPU密集型也叫计算密集型,是指IO在很短的时间就可以完成,CPU需要大量的计算处理,特点是CPU占有率相当高
      • 例如:压缩和解压缩、加密解密、正则表达式搜索
    • IO密集型计算(IO-bound):

      • IO密集型是指系统运行大部分的状况是CPU在等待IO(硬盘/内存)的读写操作,CPU占有率较低。

      • 例如:文件处理程序、网络爬虫程序、读写数据库程序

  • 多线程、多进程、多协程的对比
    • 多进程Process(multiprocessing)
      • 优点:可以利用多核CPU进行运算
      • 缺点:占用资源最多,可启动数目比线程少(受硬件CPU数量限制)
      • 适用于:CPU密集型计算
    • 多线程Thread(Threading):
      • 优点:相比进程,更加轻量级,占用资源少
      • 缺点:
        • 先比进程,多线程只能并发执行,不能使用多CPU(GIL全局解释器锁)
        • 相比协程,启动数目有限制,占用内存资源,有线程切换开销
      • 适用于:IO密集型计算、同时运行的任务数目要求不多。
    • 多协程Coroutine(asyncio)
      • 优点:内存开销最小,启动数量最多,甚至可以多达几万个
      • 缺点:python的支持库有限制(例如协程不能使用requests库只能使用aiohttp),而且实现起来也比较复杂。
      • 适用于:IO密集型计算、需要超多任务运行的场景、但是也必须是有python现有库支持的场景
    • 一个进程中可以启动多个线程
    • 一个线程中国也可以启动多个协程
  • 怎么根据任务选择对应的技术
    • 首先,我们先分析待执行任务的任务特点。
    • 如果它是CPU密集型计算任务,那么可以直接选择使用多进程。
    • 如果它是IO密集型计算任务,就需要继续分析以下几个方面。
      • 是否需要很多的任务量?
      • 是否有现成的协程库的支持?
      • 是否可以接受协程实现的复杂度?
    • 如果以上三个方面综合考虑结果为是就可以选择使用多协程。
    • 否则的话,如果以上三种方面综合考虑是否的话,就推荐使用多线程。

猜你喜欢

转载自blog.csdn.net/qq_42546127/article/details/115031998
今日推荐