并发编程4

1 GIL

  GIL是一个全局解释器锁,是一种互斥锁

  一个python.exe进程中只有一份解释器,如果职工进程开启了多个线程都要执行代码

    多线程之间要竞争解释器,一旦竞争就会出现问题

  GIL带来的问题是同一时间只有一个线程可以访问解释器

  好处是保证了多线程的数据安全

  thread-safe 线程安全,多个线程同时访问也不会出现问题

  not thread-safe 非线程安全,多个线程同时访问可能出现问题

  GC垃圾回收

  默认情况下一个进程只有一个线程,是不会出现问题的,但是不要忘记还有GC线程一旦出现多个线程就可能出现问题,所以当初就简单粗暴的加上了GIL锁

  由于有GIL的存在即使有多个CPU也不可能真正的并行

  应用程序分为两种

  IO密集型  IO操作较多,纯计算较少  采用多线程

  计算密集型  计算曹军较多,IO操作较少  采用多进程

  当多线程需要共享一个不属于解释器的资源时,必须要自己加锁

2 线程池,进程池

  池是一种容器

  服务器不可能无限的开线程,所以需要对线程数量加以控制,线程池就是帮我们封装了线程数量的控制,以及线程的创建,销毁,任务分配

  进程池与线程池相同

  特点:
    线程池在创建时不会立即开启线程

    等到提交任务时,如果没有空闲线程并且已存在的线程数量小于最大值时,会新开一条线程

    线程池中的线程开启后就不会关闭了,直到进程全部结束

3 同步 异步 阻塞 非阻塞

  阻塞:程序运行过程中遇到IO操作,无法继续运行

  非阻塞:程序正在运行中并且没有遇到IO操作,即使遇到IO也不会阻塞,CPU不会切走

  阻塞,非阻塞指的是程序的执行状态

  同步,异步指的是发起任务的方式

  同步:在发起任务后必须在原地等待,任务执行完毕才能继续往下执行

  异步:在发起任务后立即继续往下执行,不需要等待任务的执行结果

  异步效率高于同步

  发起异步任务的方式就是线程和进程

  同步和阻塞时完全不同的:
    阻塞一定是CPU已经切走了

    同步虽然会卡住,但是CPU没有切走还在你的进程中

原文地址:https://www.cnblogs.com/LinChengcheng/p/10496394.html