我想测试我的应用程序如何响应持有 GIL 的函数。是否有一个方便的函数可以在可预测的(甚至很长的)时间内保持 GIL?

我理想的函数应该是像 time.sleep 一样操作的东西,除了与 sleep 不同的是,它会保存 GIL

最佳答案

持有 GIL 的一种简单但很老套的方法是使用 re 模块和已知的慢速匹配:

import re
re.match(r'(a?){30}a{30}', 'a'*30)

在我的机器上,这在 Python 2.7.14 上保持 GIL 48 秒(在 3.6.3 上几乎一样长)。但是,这取决于实现细节,如果 re 模块得到改​​进,则可能会停止工作。

更直接的方法是编写一个只休眠的 c 模块。 Python C 扩展不会自动释放 GIL(与 ctypes 不同)。按照 hellomodule 示例 here ,并将 printf() 替换为对 sleep() (或 the Windows equivalent )的调用。构建模块后,您将拥有一个可以在任何地方使用的 GIL 保持函数。

关于python - 保存 GIL 的简单 Python 函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39103557/

10-12 23:08