线程进程协程并发

  1. GIL global interpreter lock (cpython)  全局解释器
    1.  python 中的一个线程对应于C 语言中的一个线程
    2. gil 使得同一个时刻只有一个线程在一个CPU 上执行字节码,无法将多个线程映射到多个CPU 上执行
    3. GIL会根据执行的字节码行数以及时间片释放GIL ,GIL 在遇到IO 操作时主动释放
  2. 并发并行
    1.  并发:
      1. 一个时间段内,有几个程序同时在一个CPU 上运行,但是任意时刻只有一个程序在CPU 上运行
    2. 并行
      1. 任意时间点上,有多个程序同运行在多个CPU 上,并行数与CPU 数一致
  3. 同步异步
    1. 同步
      1. 同步是指代码调用IO操作时,必须等待IO操作完成才返回的调用方式
    2. 异步
      1. 异步是指代码调用IO 操作时,不必等IO 操作完成就返回的调用 方式
  4. 阻塞、非阻塞
    1. 阻塞是指调用函数时后当前线程被挂起
    2. 非阻塞是指调用函数时候在当前线程不会被挂起,而是立即返回
  5. Unix下五种I/O 模型
    1. 阻塞式I/O
    2. 非阻塞式I/O
    3. I/O 复用
    4. 信号驱动式I/O
    5. 异步i/o(POSIX的aio系列函数)
  6. select、pool、epoll
    1. select、pollepoll 都是IO 多路复用的机制。I/O 多路复用就是通过一种机制,一个进程可以监控多个描述符,一旦某个描述符就绪(一般是都就绪或者写就绪),能够通知程序 进行相应的读写操作,但select,poll,epoll 本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O 则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间
    2. select
      1. poll
      2. epoll
      3. #1. epoll 并不一定比select好
        #在并发高的情况下,连接活跃度不是很高,epoll 比select 好
        #并发不高,同时连接很活跃,select 比epoll 好
  7. C10M问题
    1. 如何利用8核CPU 64G 内存,在10gbps 的网络上保持1000万并发连接
  8.  什么是协程

    1.  解决问题
      1. 回调模式编码复杂度高
      2. 同步编程的并发性不高
      3. 多线程编程需要线程同步,lock
    2. 方法
      1. 采用同步的方式去编写异步的代码
      2. 采用单线程去切换任务
        1. 线程是由操作系统切换 的,单线程以为着我们需要程序员自己去调度任务
        2. 不再需要锁,并发性高,如果单线程内切换函数,性能远高于线程切换,并发性高
  9. asyncio  异步IO
    1. 包含各种 特定系统实现的模块化事件循环
    2. 输出和协议抽象
    3. 对 tcp 、UDP、SSL、子进程,延时调用以及其他的具体支持
    4. 模仿futures模块但适用于事件循环使用的Future类
    5. 基于yield from 的协议和任务,可以让你用顺序的方式编写并发代码
    6. 必须使用一个将产生阻塞IO 的调用时,有接口可以把这个事件转移到线程池
    7. 模仿threading 模块中的同步原语、可以用在单线程内的协程之间
  10. q
原文地址:https://www.cnblogs.com/nancyfeng/p/13657872.html