gpt4 book ai didi

Python:GIL 上下文——切换

转载 作者:太空狗 更新时间:2023-10-29 21:08:53 24 4
gpt4 key购买 nike

因此,我通常对 Global Interpreter Lock 的工作方式有很好的理解。 (GIL) 在 Python 中有效。本质上,当解释器运行时,一个线程持有 GIL N 个滴答(其中 N 可以使用 sys.setcheckinterval 设置),此时 GIL 被释放并且另一个线程可以获得 GIL。如果一个线程开始 I/O 操作,也会发生这种情况。

我有点困惑的是这一切如何与 C 扩展模块一起工作。

如果你有一个获取 GIL 的 C 扩展模块,然后使用 PyEval_EvalCode 执行一些 python 代码,解释器可以释放 GIL 并将其交给其他线程吗?或者,获取 GIL 的 C 线程是否会永久持有 GIL,直到 PyEval_EvalCode 返回并且 GIL 在 C 中明确释放?

PyGILState gstate = PyGILState_Ensure();

....

/* Can calling PyEval_EvalCode release the GIL and let another thread acquire it?? */
PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict);

PyGILState_Release(gstate);

最佳答案

是的,解释器总是可以释放GIL;它会在解释了足够的指令后将其交给其他线程,或者如果它执行某些 I/O 则自动将其交给其他线程。请注意,自最近的 Python 3.x 以来,标准不再基于执行指令的数量,而是基于是否经过了足够的时间。

要获得不同的效果,您需要一种以“原子”模式获取 GIL 的方法,方法是要求在明确释放 GIL 之前不要释放它。到目前为止这是不可能的(但请参阅 https://bitbucket.org/arigo/cpython-withatomic 以获得实验版本)。

关于Python:GIL 上下文——切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com