当前位置: 首页 > news >正文

哪个网站有学做内帐的视频织梦高清电影网站模板

哪个网站有学做内帐的视频,织梦高清电影网站模板,销售平台网站建设方案模板,长沙租车网站排名通过前面的学习#xff0c;我们了解了 Pyton 并发编程的特性以及什么是多线程编程。其实除此之外#xff0c;Python 多线程还有一个很重要的知识点#xff0c;就是本节要讲的 GIL。 GIL#xff0c;中文译为全局解释器锁。在讲解 GIL 之前#xff0c;首先通过一个例子来直观…通过前面的学习我们了解了 Pyton 并发编程的特性以及什么是多线程编程。其实除此之外Python 多线程还有一个很重要的知识点就是本节要讲的 GIL。 GIL中文译为全局解释器锁。在讲解 GIL 之前首先通过一个例子来直观感受一下 GIL 在 Python 多线程程序运行的影响。 首先运行如下程序 import time start time.clock() def CountDown(n): while n 0: n - 1 CountDown(100000) print(Time used:,(time.clock() - start)) 运行结果为 Time used: 0.0039529000000000005 在我们的印象中使用多个适量线程是可以加快程序运行效率的因此可以尝试将上面程序改成如下方式 import time from threading import Thread start time.clock() def CountDown(n): while n 0: n - 1 t1 Thread(targetCountDown, args[100000 // 2]) t2 Thread(targetCountDown, args[100000 // 2]) t1.start() t2.start() t1.join() t2.join() print(Time used:,(time.clock() - start)) 运行结果为 Time used: 0.006673 可以看到此程序中使用了 2 个线程来执行和上面代码相同的工作但从输出结果中可以看到运行效率非但没有提高反而降低了。 如果使用更多线程进行尝试会发现其运行效率和 2 个线程效率几乎一样本机器测试使用 4 个线程其执行效率约为 0.005。这里不再给出具体测试代码有兴趣的读者可自行测试。 是不是和你猜想的结果不一样事实上得到这样的结果是肯定的因为 GIL 限制了 Python 多线程的性能不会像我们预期的那样。 那么什么是 GIL 呢GIL 是最流程的 CPython 解释器平常称为 Python中的一个技术术语中文译为全局解释器锁其本质上类似操作系统的 Mutex。GIL 的功能是在 CPython 解释器中执行的每一个 Python 线程都会先锁住自己以阻止别的线程执行。 当然CPython 不可能容忍一个线程一直独占解释器它会轮流执行 Python 线程。这样一来用户看到的就是“伪”并行即 Python 线程在交替执行来模拟真正并行的线程。 有读者可能会问既然 CPython 能控制线程伪并行为什么还需要 GIL 呢其实这和 CPython 的底层内存管理有关。 CPython 使用引用计数来管理内容所有 Python 脚本中创建的实例都会配备一个引用计数来记录有多少个指针来指向它。当实例的引用计数的值为 0 时会自动释放其所占的内存。 举个例子看如下代码import sysa []b asys.getrefcount(a) 3 可以看到a 的引用计数值为 3因为有 a、b 和作为参数传递的 getrefcount 都引用了一个空列表。 假设有两个 Python 线程同时引用 a那么双方就都会尝试操作该数据很有可能造成引用计数的条件竞争导致引用计数只增加 1实际应增加 2这造成的后果是当第一个线程结束时会把引用计数减少 1此时可能已经达到释放内存的条件引用计数为 0当第 2 个线程再次视图访问 a 时就无法找到有效的内存了。 所以CPython 引进 GIL可以最大程度上规避类似内存管理这样复杂的竞争风险问题。 Python GIL底层实现原理图 1 GIL 工作流程示意图 上面这张图就是 GIL 在 Python 程序的工作示例。其中Thread 1、2、3 轮流执行每一个线程在开始执行时都会锁住 GIL以阻止别的线程执行同样的每一个线程执行完一段后会释放 GIL以允许别的线程开始利用资源。 读者可能会问为什么 Python 线程会去主动释放 GIL 呢毕竟如果仅仅要求 Python 线程在开始执行时锁住 GIL且永远不去释放 GIL那别的线程就都没有运行的机会。其实CPython 中还有另一个机制叫做间隔式检查check_interval意思是 CPython 解释器会去轮询检查线程 GIL 的锁住情况每隔一段时间Python 解释器就会强制当前线程去释放 GIL这样别的线程才能有执行的机会。 注意不同版本的 Python其间隔式检查的实现方式并不一样。早期的 Python 是 100 个刻度大致对应了 1000 个字节码而 Python 3 以后间隔时间大致为 15 毫秒。当然我们不必细究具体多久会强制释放 GIL读者只需要明白CPython 解释器会在一个“合理”的时间范围内释放 GIL 就可以了。 整体来说每一个 Python 线程都是类似这样循环的封装来看下面这段代码 for (;;) { if (--ticker 0) { ticker check_interval; /* Give another thread a chance */ PyThread_release_lock(interpreter_lock); /* Other threads may run now */ PyThread_acquire_lock(interpreter_lock, 1); } bytecode *next_instr; switch (bytecode) { /* execute the next instruction ... */ } } 从这段代码中可以看出每个 Python 线程都会先检查 ticker 计数。只有在 ticker 大于 0 的情况下线程才会去执行自己的代码。 Python GIL不能绝对保证线程安全 注意有了 GIL并不意味着 Python 程序员就不用去考虑线程安全了因为即便 GIL 仅允许一个 Python 线程执行但别忘了 Python 还有 check interval 这样的抢占机制。 比如运行如下代码 import threading n 0 def foo(): global n n 1 threads [] for i in range(100): t threading.Thread(targetfoo) threads.append(t) for t in threads: t.start() for t in threads: t.join() print(n) 执行此代码会发现其大部分时候会打印 100但有时也会打印 99 或者 98原因在于 n1 这一句代码让线程并不安全。如果去翻译 foo 这个函数的字节码就会发现它实际上是由下面四行字节码组成import disdis.dis(foo) LOAD_GLOBAL 0 (n) LOAD_CONST 1 (1) INPLACE_ADD STORE_GLOBAL 0 (n) 而这四行字节码中间都是有可能被打断的所以千万别以为有了 GIL 程序就不会产生线程问题我们仍然需要注意线程安全。
http://www.yutouwan.com/news/387359/

相关文章:

  • 做的不好的网站内网访问 wordpress
  • php网站下载电商数据分析网站
  • 成都专业网站设计公司河南做网站的公司
  • 做网站腾讯云服务器吗汽车品牌大全汽车网
  • 专业网站设计制作费用宁波百度做网站的公司哪家好
  • 临沂网站建设哪家公司好中核集团电子商城
  • 建一个公司网站花多少钱外贸seo博客
  • AWS免费套餐做网站可以吗网站建设一般多少钱新闻
  • 帮企业做网站赚钱吗全球网站建设服务商
  • 怎样保证网站的安全性林州网站建设制作
  • 长春做商业平台网站京润珍珠企业网站优化
  • 网站开发一个人可以完成吗做系统那个网站好
  • 梧州高端网站建设服务网站域名包括哪些
  • 做优惠券网站苏州优化有限公司
  • 增城网站公司电话建设招标网网站
  • 昆明云南微网站制作哪家好网络技术有限公司是什么
  • 如何提升网站的搜索排名网站优化可以自己做么
  • 如何在电商网站做市场调研东营网站制作公司
  • 湖南营销型网站建设磐石网络北京餐饮设计公司
  • div做网站定制平台有哪些
  • 怎么做qq刷赞等网站网站短时间怎么做权重
  • 网站外链怎么购买网站网页设计如何选
  • 新开网站seo搭建网站平台需要多少钱
  • 百度站长论坛福州精美个人网站建设公司
  • 网站做背景不显示单位网站备案要等多久
  • 资讯类网站模板asp秦皇岛市人事考试网
  • 江西安福县建设局网站金融网站建设案例
  • 宝山品牌网站建设口碑好的合肥网站建设
  • wordpress客户端建站时间轴网站模板
  • go做的网站好看的企业网站首页