我想测试我的应用程序如何响应持有GIL的函数。是否有一个方便的功能可以将GIL保持在可预测的(甚至是很长的)时间内?
我理想的功能就像time.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保持功能。