Python 是怎么知道一个线程是 io 操作,然后释放 GIL 锁给别的线程执行

2019-01-15 17:07:14 +08:00
 py1991
2451 次点击
所在节点    Python
8 条回复
neoblackcap
2019-01-15 17:22:03 +08:00
底层 IO 接口手动释放 GIL,这个其实你看看 CPython 源代码就知道了。
ysc3839
2019-01-15 17:30:02 +08:00
py1991
2019-01-15 18:18:44 +08:00
@neoblackcap 惭愧,c 不会,看不懂=。=
lihongjie0209
2019-01-15 18:22:27 +08:00
最简单的, Python 标准库中所有的 io 操作都记录一下, 那么你基于标准实现的其他库你可以就知道了.


实在不行, 你还可以看看操作系统是不是有什么接口可以使用
py1991
2019-01-15 18:25:30 +08:00
@ysc3839 do {
Py_BEGIN_ALLOW_THREADS
ret = fcntl(fd, code, buf);
Py_END_ALLOW_THREADS
} while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals()));

能否解释下,感觉只看懂了线程开始和结束,循环 fcntl 是否结束
wwqgtxx
2019-01-15 20:34:14 +08:00
@py1991 Py_BEGIN_ALLOW_THREADS 这个宏的意思就是释放 GIL,然后 Py_END_ALLOW_THREADS 再锁上
cyspy
2019-01-15 20:49:13 +08:00
IO 的核心部分其实是系统内核完成的,调用内核的时候放开就行了
zhichaozhang
2019-01-15 20:56:18 +08:00
线程执行是抢占式的 是由系统来调度的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/527300

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX