发布于2019-08-06 11:40 阅读(662) 评论(0) 点赞(5) 收藏(0)
一段代码
def CountDown(n): while n > 0: n -= 1 # CountDown(100000000) #==8秒 from threading import Thread n = 100000000 t1 = Thread(target=CountDown, args=[n // 2]) t2 = Thread(target=CountDown, args=[n // 2]) t1.start() t2.start() t1.join() t2.join() #==9s
GIL,是最流行的 Python 解释器 CPython 中的一个技术术语。它的意思是全局解释器锁,本质上是类似操作系统的 Mutex。每一个 Python 线程,在 CPython 解释器中执行时,都会先锁住自己的线程,阻止别的线程执行。CPython 会做一些小把戏,轮流执行 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 ... */ } }
GIL 的设计,主要是为了方便 CPython 解释器层面的编写者,而不是 Python 应用层面的程序员。
作为 Python 的使用者,我们还是需要 lock 等工具,来确保线程安全。比如下面的这个例子:
n = 0 lock = threading.Lock() def foo(): global n with lock: n += 1
事实上,很多高性能应用场景都已经有大量的 C 实现的 Python 库,例如 NumPy 的矩阵运算,就都是通过 C 来实现的,并不受 GIL 影响。 所以,大部分应用情况下,你并不需要过多考虑 GIL。因为如果多线程计算成为性能瓶颈,往往已经有 Python 库来解决这个问题了。
极客时间《Python核心技术实战》专栏
作者:爬虫soeary
链接:https://www.pythonheidong.com/blog/article/8471/22e57a222a65e65acb67/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!