• 多线程2


    在CPython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势

    GIL本质是一把互斥锁,保护不同的数据的安全,应该加不同的锁

    所有数据都是共享的,代码作为一种数据也是被所有线程共享,所有线程的任务,都需要将任务的代码当做参数传给解释器的代码去执行

    GIL保护的是解释器级的数据保护自己的数据需要自己加锁处理

    GIL的存在使得同一时刻统一进程中只有一个线程被执行,因为CPython的内存管理机制非线程安全的,很多其他的特性依赖于GIL,所以即使它影响了程序效率也无法去除

    在CPython中,GIL会把线程的并行变成串行,导致效率降低

    每当执行一个文件,就会启动一个python解释器

    py文件中的内容本质都是字符串,只有在被解释器解释时,才具备语法意义,解释器会将py代码翻译为当前系统支持的指令交给系统执行

    有了GIL后,多个线程将不可能在同一时间使用解释器,从而保证了解释器的数据安全

    GIL的解锁与解锁时机

    加锁的时机:在调用解释器时立即加锁

    解锁时机:

      当前线程遇到了IO时释放

      当前线程执行时间超过设定值时释放,解释器会检测线程的执行时间,一旦到达某个阈值,通知线程保存状态切换线程,以此来保证数据安全

    多线程用于IO密集型,如socket,爬虫,web

    多进程用于计算密集型,如金融分析

    Pool可以提供指定数量的进程,供用户调用,当新的请求提交到pool中时,池未满,就会创建一个新的进程来执行该请求,如果池中进程数已经达到最大值,那么该请求就会等待,直到池中有进程结束就重用进程池中的进程

    方法:close()关闭进程池

    get()返回结果

    ready()如果调用完成,返回True

    successful()如果调用完成且没有引发异常,返回True,如果在结果就绪之前调用此方法,引发异常

    wait()等待结果变为可用

    terminate()立即终止所有工作进程,,同时不执行任何清理或结束任何挂起工作

    进程池,默认参数为cpu核心数*1

    线程池,默认参数为cpu核心数*5

    阻塞 非阻塞

    程序遇到了IO操作,无法继续执行代码,叫做阻塞

    程序没有遇到IO操作,正常执行中,就叫非阻塞

    他们是指程序运行的状态

    就绪 运行 阻塞

    同步 异步

    同步(调用/执行/任务/提交),发起任务后必须等待任务结束,拿到一个结果才能继续运行

    异步 发起任务后不关心任务的执行过程,可以继续往下运行

    异步效率高于同步

    但是并不是所有任务都可以异步运行,哦按段任务是否可以异步的条件是,任务发起方是否立即需要执行结果

    同步不等于阻塞,异步不等于非阻塞

    当使用异步方式发起任务时,任务中可能包含io操作,异步也可能阻塞

    同步提交任务可能需要时间,但是不等于阻塞

    线程池方法:

    submit()以异步的方式提交任务

    result()是阻塞的,会等到任务执行完成才继续执行会异步变成同步

    shutdown()是一个阻塞函数,会等到线程池所有任务完成后继续执行

    进程池/线程池

    本质是一个存储进程或线程的列表

  • 相关阅读:
    Git配置SSH访问GitHub
    vue 관련
    node
    关于CheckBox和EditText在ListView里多布局的处理
    百度地图定位
    java常用简单正则表达式写法
    Android二维码开源项目zxing编译
    Andrew XUtils的session获得和cookieStore使用
    常用易忘知识点
    替换Fragment 报错 The specified child already has a parent. You must call removeView()
  • 原文地址:https://www.cnblogs.com/suncunxu/p/10214275.html
Copyright © 2020-2023  润新知