我想测试我的应用程序如何响应持有GIL的函数。是否有一个方便的功能可以将GIL保持在可预测的(甚至是很长的)时间内?
我的理想功能是像time.sleep
那样运作的东西,除了与睡眠不同,它会保持GIL
答案 0 :(得分:2)
保持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()
(或the Windows equivalent)替换sleep()
。构建模块后,您将拥有可在任何地方使用的GIL保持功能。
答案 1 :(得分:0)
您可以在“ PyDLL”模式下使用C库的睡眠功能。
,
(有关如何腌制引用的详细信息,请参见https://gist.github.com/jonashaag/d455671003205120a864d3aa69536661,例如,如果在分布式计算环境中使用,则为该引用。)