包含GIL的简单Python函数

我想测试我的应用程序如何响应持有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,并用sleep()(或the Windows equivalent)调用替换printf().构建模块后,您将拥有可在任何地方使用的GIL保持功能.

点赞