python 第四阶段 学习记录之

时间:2021-10-09 21:52:24

异步:

知识情况:

 

 

1、多线程, 多线程使用场景

1、IO操作不占CPU,读写数据(网络中、系统中)

2、计算占CPU,

3、上下文切换不占CPU、它消耗资源

python多线程 不适合CPU密集型的任务, 适合IO操作密集型的任务

      那么如何利用呢?

8核? 那我就启动8个进程、每个进程里有一个主线程干活。

2、进程数据共享

    队列queue

    进程queue from multiprocessing import Queue

    管道: parent_conn, child_conn. = Pipe()

    多进程间传递的dict、list

with Manager() as manager:

d = manager.dict() l = manager.list(range(5))

    进程锁: 这个干毛,又不会同时修改数据、数据都独立了。……其实有一个是共享的,那就是屏幕,大家都抢着打印数据、锁了之后,这样就按照信息

 

3、进程池,为什么要这个?那是当然,进程是克隆父进程出来的,要是不限制,起一千个进程、内存直接爆了。 线程有池吗?没有,不过可以用信号量来玩、线程启动多了,只是CPU切换会变慢、线程几乎不占资源的。

apply_async(func=foo, args=(I,), callback=Bar) # 这个有回调

这里需要先close,然后join

apply这个串行、哪种情况会使用呢? 

 

异步IO、这是底层的东西、一般人都搞不懂的东西、工作中也很少用、因为有框架

Nginx 异步IO

4、协程。又叫微线程

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

 

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:

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

在单线程中实现并发的功能 这就是协程

协程的好处:

  • 无需线程上下文切换的开销
  • 无需原子操作锁定及同步的开销
    •   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。视作整体是原子性的核心。
  • 方便切换控制流,简化编程模型
  • 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

 

缺点:

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

 

单线程、协程、yield、原子。

 

select\poll\epoll