包含GIL的简单Python函数

时间:2016-08-23 14:09:08

标签: python python-multithreading gil

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

我的理想功能是像time.sleep那样运作的东西,除了与睡眠不同,它会保持GIL

2 个答案:

答案 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,例如,如果在分布式计算环境中使用,则为该引用。)