• python并发编程知识点总结


    1.到底什么是线程?什么是进程?

    Python自己没有这玩意,Python中调用的操作系统的线程和进程.

    2.Python多线程情况下:

    • 计算密集型操作:效率低,Python内置的一个全局解释器锁,锁的作用就是保证同一时刻一个进程中只有一个线程可以被cpu调度,多线程无法利用多核优势,可以通过多进程方式解决,但是比较浪费资源.
    • IO操作:效率高

    3.Python多进程的情况下:

    • 计算密集型操作:效率高(浪费资源),不得已而为之.
    • IO操作:效率高(浪费资源)

    4.为什么有这把GIL锁?

    Python语言的创始人在开发这门语言时,目的快速把语言开发出来,如果加上GIL锁(C语言加锁),切换时按照100条字节指令来进行线程间的切换.

    5.Python中线程和进程(GIL锁)

    GIL锁,全局解释器锁.用于限制一个进程中同一时刻只有一个线程被cpu调度.
    扩展:默认GIL锁在执行100个cpu指令(过期时间).
    查看GIL切换的指令个数

    import sys
    v1 = sys.getcheckinterval()
    print(v1)
    

    6.为什么要创建线程?

    由于线程是cpu工作的最小单元,创建线程可以利用多核优势实现并行操作(Java/C#).
    注意:线程是为了工作.

    7.为什么要创建进程?

    进程和进程之间做数据隔离(Java/C#).
    注意:进程是为了提供环境让线程工作.

    8.进程和线程的区别?

    进程是资源分配的最小单位,线程是程序执行的最小单位.
    进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段,堆栈段和数据段,这种操作非常昂贵.而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程小很多,同时创建一个线程的开销比进程要小很多.
    线程之间的通信更方便,同一进程下的线程共享全局变量,静态变量,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
    但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
    也正是由于GIL锁的原因:IO密集型操作可以使用多线程,计算密集型可以使用多进程.

    9.线程创建的越多越好吗?

    不好.线程之间进行切换时,要做上下文管理.

    10.生产者消费者模型解决了什么问题?

    不用一直等待的问题.

    11.Lock和RLock的区别是RLock可以多次加锁.

    12.进程和线程以及协程的区别?

    进程是cpu资源分配的最小单元,一个进程中可以有多个线程。
    线程是cpu计算的最小单元。
    对于Python来说他的进程和线程和其他语言有差异,是有GIL锁.
    GIL锁保证一个进程中同一时刻只有一个线程被cpu调度.
    注意:IO密集型操作可以使用多线程,计算密集型可以使用多进程.

    协程,是由程序员创造出来的一个不是真实存在的东西.
    协程,是微线程,对一个线程进程分片,使得线程在代码块之间进行来回切换执行,而不是在原来逐行执行.

    13.IO多路复用作用?

    检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写)
    IO多路复用作用?
    检测多个socket是否发生变化。
    操作系统检测socket是否发生变化,有三种模式:
    select:最多1024个socket;循环去检测。
    poll:不限制监听socket个数;循环去检测(水平触发)。
    epoll:不限制监听socket个数;回调方式(边缘触发)。
    Python模块:
    select.select
    select.epoll

    14.socket默认是否是阻塞的?阻塞体现在哪里?

    默认是阻塞,填在等待消息和连接

    15.什么是异步非阻塞?

    • 非阻塞,不等待。
      比如创建socket对某个地址进行connect、获取接收数据recv时默认都会等待(连接成功或接收到数据),才执行后续操作。
      如果设置setblocking(False),以上两个过程就不再等待,但是会报BlockingIOError的错误,只要捕获即可。
    • 异步,通知,执行完成之后自动执行回调函数或自动执行某些操作(通知)。
      比如做爬虫中向某个地址baidu.com发送请求,当请求执行完成之后自执行回调函数。

    16.什么是同步阻塞?

    - 阻塞:等 
    - 同步:按照顺序逐步执行
    

    17.什么是协程?

    协程也可以称为“微线程”,就是开发者控制线程执行流程,控制先执行某段代码然后再切换到另外函执行代码...来回切换。

    18.协程可以提高并发吗?

    协程自己本身无法实现并发(甚至性能会降低)。
    协程+IO切换性能提高。

    19.提高并发方案:

  • 相关阅读:
    20181205关于android动态权限管理的总结与思考。
    pixel2坑
    Picasso遇到的坑
    集成主流框架搭建项目
    outdoor-youwin
    利用scatter()绘制颜色映射的二次方曲线
    一个有意义的Day类
    [Hadoop] Yarn & k8s
    hadoop 操作
    yarn 图形化监控
  • 原文地址:https://www.cnblogs.com/apollo1616/p/10351583.html
Copyright © 2020-2023  润新知