那些年被我坑过的Python——你来我往(第九章 selectors)

进程、线程、协程(微线程)、队列的概念理解

进程
进程是全部相关资源的集合,而线程是和CPU交互的最小单元
进程至少包含一个线程,是主线程

线程
线程之间能够共享资源
线程同时修改同一份数据时必须加锁,mutex为互斥锁
递归锁编程

是为了防止锁死的状况而使用的机制,机制是把对应的锁与锁的释放对应起来

join()等待线程的执行结果!

守护线程
做用:服务于非守护线程(非守护线程至关于Master,守护线程至关于Slave),因此若是非守护线程停掉以后,守护线程会随之中止,设置为守护线程的含义是没必要等待它执行完成,或者说守护线程的执行结果是否完成从主要逻辑上不该对主线程的执行有任何影响。因此设置完守护进程以后就没有必要使用join来等待全部守护线程执行完成。


队列(queue)的做用:
一、解耦,使程序直接实现松耦合
二、提升处理效率

队列的分类:
先进先出FIFO first in first out
后进先出LIFO last in first out

队列是有序的
队列与列表的区别是 它仅有一份数据,当数据读取使用后则从队列中消除,而列表是长时间持有


何时使用Python多线程(假多线程):
基础须知:
IO操做不占用cpu(内存、硬盘读写、网络传输)
计算使用cpu
上下文切换会占用资源

因此
Python多线程
不适合CPU密集操做型的任务
而适合IO操做密集型的任务

Python
Python使用的进程是系统原生进程,而线程是包装的网络

线程会受到GIL的管理,但进程不受;因此多进程是解决CPU密集操做型更好利用多核CPU的可行办法,而多线程不适合



进程Queue和线程queue的区别!
进程的能够在多进程间通讯
线程的只能在一个进程的多个线程之间通讯


进程池
同一时间有多少进程运行,避免启太多进程占光系统资源,理解:多线程

由于Python使用的是系统的原生进程,因此若是过多的Forking会使得系统资源迅速被占光,并发

使用进程池的目的是为了更好的管控程序占用的系统资源,至关于地铁刷卡门禁,统一时间只能有有限个数的人经过,某我的经过后相应的位置就空出就容许下一我的继续刷卡

socket

 协程高并发

协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程url

协程拥有本身的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。所以:spa

协程能保留上一次调用时的状态(即全部局部状态的一个特定组合),每次过程重入时,就至关于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。线程

 

协程的好处:协程

  • 无需线程上下文切换的开销
  • 无需原子操做锁定及同步的开销
  • 方便切换控制流,简化编程模型
  • 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。因此很适合用于高并发处理。

缺点:

  • 没法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程须要和进程配合才能运行在多CPU上.固然咱们平常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
  • 进行阻塞(Blocking)操做(如IO时)会阻塞掉整个程序

使用yield实现协程操做例子    


gevent是对greenlet的自动封装

urllib和socket默认不支持gevent

相关文章
相关标签/搜索