强制GIL不切换线程

5
我正在分析一些多线程的CPython代码。
为了测量执行特定代码段所需的时间,我想强制GIL(全局解释器锁)在该段时间内在线程之间切换。如何做到这一点?

更新:
假设以下是伪代码:

some_code_1()
make_the_interpreter_not_change_thread()
take_start_time()   # time critical
code_to_profile()   # time critical
take_end_time()     # time critical
release_the_interpreter()
some_code_2()

我的担忧是,在“时间关键”的分析期间,解释器会切换线程。

1个回答

7

GIL不会切换线程。GIL是一个互斥锁,防止多个线程同时执行字节码。因此,要防止线程切换,您需要在其他地方寻找解决方案。

您可以使用非常大的值调用sys.setcheckinterval()以在对代码进行分析时防止切换。

每当您调用sys.setcheckinterval(count)时,当前的“计数器”将被重置为新值,因此一旦调用它,至少需要count字节码指令才允许线程切换。


请查看我的问题更新。在make_the_interpreter_not_change_thread()中通过sys.setcheckinterval()放置一个大数字是否可行?解释器是否会更改Python虚拟指令的当前计数,或者新值只会在下一次解释器检查周期生效,这可能会在code_to_profile()期间不幸发生? - Jonathan Livni
1
@Jonathan:当调用该函数时,它会重置当前计数。因此,使用较大的值调用它可以确保在执行该数量的字节码指令时不会进行线程切换。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接