Python并发编程

一、并发编程简介

1、并发编程的目的就是为了提升程序运行速度

2、程序提速的方法:单线程串行(不加改造的程序)-->多线程并发(threading)-->多进程并行(multiprocessing)-->多机器并行(hadoop/hive/spark)

3、Python对并发编程的支持

  • 多线程:threading,利用CPU计算和IO读写可以同时执行的原理,让CPU不会干巴巴的等待IO完成,可以去做其他事
  • 多进程:multiprocessing,利用多核CPU和IO的能力,真正的并行执行任务
  • 异步IO(协程):asyncio,在单线程下利用CPU和IO可以同时执行的原理,实现函数异步执行
  • 使用Lock对资源加锁,防止冲突访问
  • 使用Queue实现不同线程/进程之间的数据通信,实现生产者-消费者模式
  • 使用线程池Pool、进程池Pool,简化线程、进程的任务提交、等待结束、获取结果
  • 使用subprocess启动外部程序,并进行输入输出交互

二、多线程Thread、多进程Process、多协程Coroutine概述

1、什么是CPU密集型计算、IO密集型计算?

  • CPU密集型:也叫计算密集型,是指IO在很短时间就可以完成,CPU需要大量的计算和处理,特点是CPU占用相当高,如压缩和解压、加密和解密、正则表达式搜索
  • IO密集型:是指程序执行大部分时间是CPU在等待IO(硬盘、内存)的读写操作,CPU占用率较低,如文件处理程序、网爬虫资源下载、读写数据库程序

2、多线程、多进程、多协程的对比?

  一个进程中可以启动N个线程、一个线程可以启动N个协程(异步IO)

  • 多进程multiprocessing.Process
    • 优点:可以利用多核CPU并行运算
    • 缺点:占用资源最多、受CPU限制可以启动数目比线程少
    • 适用于:CPU密集型计算
  • 多线程threading.Thread
    • 优点:相比进程,更轻量级、占用资源更少
    • 缺点:
      • 相比进程:多线程只能并发执行,不能利用多核CPU(GIL)
      • 相比协程:启动数目有限制,占用内存资源,有线程切换开销
    • 适用于:IO密集型计算、同时运行的任务数目要求不多
  • 多协程asyncio.Coroutine
    • 优点:内存开销最少、启动协程数量最多
    • 缺点:支持的库有限制(例如不能使用requests库,只能使用特定的aiohttp库)、代码实现复杂
    • 场景:IO密集型计算、需要超多任务运行、但有现成的库支持的场景

3、怎样根据任务选择对应技术?

原文地址:https://www.cnblogs.com/lennie-luo/p/15183008.html