Python中的全局解释器锁
数据结构和GIL
- Queue
- 标准库queue模块,提供FIFO的Queue、LIFO的队列、优先队列。
- Queue类是线程安全的,适用于多线程间安全的交换数据。内部使用了Lock和Condition。
- 在自定义容器类中,如果不加锁,是不可能获得准确的大小的,因为你刚读取到了一个大小,还没有取走数据,就有可能被其他线程改 了。
- Queue类的size虽然加了锁,但是,依然不能保证立即get、put就能成功,因为读取大小和get、put方法是分开的。
import queue
q = queue.Queue(8)
if q.qsize() == 7:
q.put() #上下两句可能会被打断
if q.qsize() == 1:
q.get() #未必会成功,同样上下两句会被打断
GIL全局解释器锁
-
CPython 在解释器进程级别有一把锁,叫做GIL,即全局解释器锁。