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

网站用html做框架asp做主页安卓开发培训机构

网站用html做框架asp做主页,安卓开发培训机构,深圳app开发公司排名,产品网站策划通过前面的学习#xff0c;我们了解了 Pyton 并发编程的特性以及什么是多线程编程。其实除此之外#xff0c;Python 多线程还有一个很重要的知识点#xff0c;就是本节要讲的 GIL。GIL#xff0c;中文译为全局解释器锁。在讲解 GIL 之前#xff0c;首先通过一个例子来直观… 通过前面的学习我们了解了 Pyton 并发编程的特性以及什么是多线程编程。其实除此之外Python 多线程还有一个很重要的知识点就是本节要讲的 GIL。GIL中文译为全局解释器锁。在讲解 GIL 之前首先通过一个例子来直观感受一下 GIL 在 Python 多线程程序运行的影响。首先运行如下程序import timestart time.clock()def CountDown(n): while n 0: n - 1CountDown(100000)print(Time used:,(time.clock() - start))运行结果为Time used: 0.0039529000000000005在我们的印象中使用多个(适量)线程是可以加快程序运行效率的因此可以尝试将上面程序改成如下方式import timefrom threading import Threadstart time.clock()def CountDown(n): while n 0: n - 1t1 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 sys a [] b a sys.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 threadingn 0def foo(): global n n 1threads []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 dis dis.dis(foo)LOAD_GLOBAL              0 (n)LOAD_CONST               1 (1)INPLACE_ADDSTORE_GLOBAL             0 (n)而这四行字节码中间都是有可能被打断的所以千万别以为有了 GIL 程序就不会产生线程问题我们仍然需要注意线程安全。
http://www.huolong8.cn/news/252131/

相关文章:

  • 酒店预定网站建设方案淄博网站建设咨询臻动传媒
  • 小米路由器3 做网站wordpress小商城
  • 织梦网站首页在哪里改iis网站属性
  • 温州建设集团有限公司网站首页科技感的网站
  • 聚合猫网站建设c#做的网站怎么上传
  • 企业网站建设总结中山移动网站建设怎么做
  • 一个自己的网站厦门企业网站开发公司
  • 网站开发用户需求说明书电子商务网站建设财务预算
  • 从什么网站可以做兼职wordpress模板路径
  • 简单网站php源码下载wordpress安装命令
  • 九江市建设规划局旧网站黑龙江省建设工程交易中心网站
  • 外贸平台哪个网站好做上海装修网官网
  • 陇南市建设局网站做个人网站用什么程序
  • 北海网站制作flash网站报价
  • 亚泰国际建设股份有限公司网站Wordpress主页不要全部显示
  • 高档网站建dw安装免费下载
  • 条幅在线设计网站编程软件做网站的
  • 做网站三河附近企业建站公司
  • dw做网站地图云端+文明实践活动
  • 大型门户网站建设学习建设网站难么
  • 免费销售网站模板php网站建设论文
  • 烟台h5响应式网站建设四川省住房与城乡建设部网站
  • 响应式网站建设看什么书安徽网站推广营销设计
  • 微网站开发周期大型网站建设机构
  • 企业网站cmsdedecms建手机网站
  • 哈尔滨做网站的公司手机网站建设制作
  • 谁会写网站代码wordpress建站动画
  • 建设网站的规划书免费网站如何做推广
  • 个人网站的内容设计专业考研平面素材网站
  • 下沙开发区建设局网站合肥在线设计