我想测试我的应用程序对持有GIL的函数的响应情况。是否有一种方便的函数可以持有GIL一段可预测(甚至是显著的)时间?我的理想函数会像
time.sleep
一样运行,但与sleep不同,它将持有GIL。time.sleep
一样运行,但与sleep不同,它将持有GIL。一种简单但不太正规的持有GIL的方式是使用re
模块和已知较慢的匹配方法:
import re
re.match(r'(a?){30}a{30}', 'a'*30)
您可以在“PyDLL”模式下使用C库的sleep函数。
# Use libc in ctypes "PyDLL" mode, which prevents CPython from
# releasing the GIL during procedure calls.
_libc_name = ctypes.util.find_library("c")
if _libc_name is None:
raise RuntimeError("Cannot find libc")
libc_py = ctypes.PyDLL(_libc_name)
...
libc_py.usleep(...)
libc_py = ctypes.PyDLL(None)
访问而无需名称,因此您可以跳过查找步骤。 - minrk
pandas.DataFrame.merge
,它会导致GIL长时间被占用,那么我的I/O将会暂停一段时间。因为这个原因我得到了糟糕的结果,我想测试一下。 - MRocklinpandas.DataFrame.merge
如何阻塞GIL感到困惑。在需要与分布式情况下的工作人员进行一致通信的情况下,是否应该每n个tick提供这种机会?鉴于Numpy操作发生在GIL之外,什么特定方面会阻止/防止工作人员的通信?除非Numpy步骤构成了一个“长tick”(解释器指令),它本身创建了一个超时(?)。 - kuanb