zoukankan      html  css  js  c++  java
  • GIL与异步回调

    07.07自我总结

    一.GIL

    1.概念

    在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁

    2.带来的问题

    首先必须明确执行一个py文件,分为三个步骤

    1. 从硬盘加载Python解释器到内存
    2. 从硬盘加载py文件到内存
    3. 解释器解析py文件内容,交给CPU执行
    • 当进程中仅存在一条线程时,GIL锁的存在没有不会有任何影响
    • 当有多个进程的时候,多个进程会争抢python解释器,这时候为了数据安全我们会上锁,从而让两个同时运行的程序从并发状态变成串行影响了程序的速度

    3.GIL与GC进程的关系

    GC进程当内存占用达到某个阈值时,GC会将其他线程挂起,然后执行垃圾清理操作,垃圾清理也是一串代码,也就需要一条线程来执行。

    GIL的加锁与解锁时机

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

    解锁时机:

    • 当前线程遇到了IO时释放
    • 当前线程执行时间超过设定值时释放

    二.异步回调

    同步

    指的是 提交任务后必须在原地等待 直到任务结束

    异步

    提交任务后不需要在原地等待 可以继续往下执行代码

    异步效率高于同步 ,异步任务将导致一个问题 就是 任务的发起方不知道任务何时 处理完毕

    解决方法:

    • 轮询 重复的隔一段时间就问一次 效率低 无法及时获取结果 不推荐

    • 让任务的执行方主动通知 (异步回调)可以及时拿到任务的结果 推荐方式

      • 多进程与多线程中相当于jion函数来告诉我们这个子有没有运行结束
      • 在队列中的jion来告诉我们队列有没有被取完
      • 在线程池与进程池中相当于result()来告诉我们有没有结束,且result还会打印方法的返回值
  • 相关阅读:
    Linux学习笔记(第一章)
    C#中的抽象类有什么好处?究竟它是用来干事什么的呢?
    C#中的 增 、删、 改、 查功能
    在Visual C#中用ListView显示数据记录
    10.14JDBC之数据库连接池之C3P0
    10.19JDBC之使用C3P0连接池重新实现JDBCUtils方法
    10.12JDBC之DAO实现类的优化
    10.13JDBC之数据库连接池
    RhinoMock入门(3)——4种Mock类型
    wse说谈(3)——策略,用户令牌
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11146937.html
Copyright © 2011-2022 走看看