【发布时间】:2017-12-20 16:55:03
【问题描述】:
Thread State and the Global Interpreter Lock:
锁也会在可能阻塞的 I/O 操作(如读取或写入文件)时释放,以便其他 Python 线程可以同时运行。
@Alex Martelli 的相关回答 here 说:
Python 的所有阻塞 I/O 原语都会在等待 I/O 块解析时释放 GIL —— 就是这么简单!他们当然需要在继续执行进一步的 Python 代码之前再次获取 GIL,但是对于他们只是等待一些 I/O 系统调用的长期机器周期间隔,他们不需要'不需要 GIL,所以他们不会坚持下去!
*这是否意味着当open 或read 或write 发生阻塞时,GIL 被释放,以便其他线程与 I/O 操作并行运行?
这样说是否正确:可能有多个线程同时执行,因为一个线程或多个线程被 I/O 操作阻塞,并且只有一个线程执行字节码。每当被 I/O 操作阻塞的线程之一需要访问 Python 对象时,它必须首先获取 GIL。
【问题讨论】:
-
你的最后一段令人困惑,你能改写一下吗?除非您使用多处理库,否则解释器一次只执行一件事。一旦解释器完成了它的工作,它就在操作系统的手中。
-
一次只能运行一个线程,期间。 GIL 用于确保这一点,它在 I/O 期间或当前线程被阻塞且无法运行时释放。见Grok the GIL。
-
@minitotent 我的意思是,如果您的线程 A 被 I/O 操作阻塞,并且您的进程由多个线程组成,比如 A、B 和 C。因为线程 A 被 I/O 阻塞O,根据操作系统的调度程序,GIL 将被释放以运行 B 或 C。因此,如果操作系统的调度程序决定运行线程 B,则将有两个线程同时运行,线程 A 和 B。
-
@martineau 我现在明白了。感谢您提供的资源,非常有用。
标签: python multithreading gil