有没有一种方法可以对python进程使用GIL进行分析?基本上,我想知道在GIL举行的时间中所占的百分比。这个过程是单线程的.
我的动机是有一些用Cython编写的代码,它使用nogil。理想情况下,我希望在多线程进程中运行它,但是为了知道这是否可能是一个好主意,我需要知道GIL是否有相当长的时间是免费的。
我在8年前找到了这个相关的问题。唯一的答案是“不”。希望从那以后情况发生了变化。
发布于 2017-03-15 19:04:13
完全是偶然的,我找到了一个工具,就是这样做的:加载。
它实际上是在我贴出问题后发表的。
“干得好,”克里斯宾顿说。
>>> import sys, math
>>> import gil_load
>>> gil_load.init()
>>> gil_load.start(output = sys.stdout)
>>> for x in range(1, 1000000000):
... y = math.log(x**math.pi)
[2017-03-15 08:52:26] GIL load: 0.98 (0.98, 0.98, 0.98)
[2017-03-15 08:52:32] GIL load: 0.99 (0.99, 0.99, 0.99)
[2017-03-15 08:52:37] GIL load: 0.99 (0.99, 0.99, 0.99)
[2017-03-15 08:52:43] GIL load: 0.99 (0.99, 0.99, 0.99)
[2017-03-15 08:52:48] GIL load: 1.00 (1.00, 1.00, 1.00)
[2017-03-15 08:52:52] GIL load: 1.00 (1.00, 1.00, 1.00)
<...>
>>> import sys, math
>>> import gil_load
>>> gil_load.init()
>>> gil_load.start(output = sys.stdout)
>>> for x in range(1, 1000000000):
... with open('/dev/null', 'a') as f:
... print(math.log(x**math.pi), file=f)
[2017-03-15 08:53:59] GIL load: 0.76 (0.76, 0.76, 0.76)
[2017-03-15 08:54:03] GIL load: 0.77 (0.77, 0.77, 0.77)
[2017-03-15 08:54:09] GIL load: 0.78 (0.78, 0.78, 0.78)
[2017-03-15 08:54:13] GIL load: 0.80 (0.80, 0.80, 0.80)
[2017-03-15 08:54:19] GIL load: 0.81 (0.81, 0.81, 0.81)
[2017-03-15 08:54:23] GIL load: 0.81 (0.81, 0.81, 0.81)
[2017-03-15 08:54:28] GIL load: 0.81 (0.81, 0.81, 0.81)
[2017-03-15 08:54:33] GIL load: 0.80 (0.80, 0.80, 0.80)
<...>发布于 2017-02-21 22:24:40
我不知道有这样的工具。
但是有一些启发式方法可以帮助您猜测多线程是否会有所帮助。正如您可能知道的那样,GIL将在IO操作和一些对本机代码的调用中释放,尤其是由第三方本地模块调用。如果您没有那么多这样的代码,那么多线程可能不会对您有所帮助。
如果您有IO/本机代码,那么您可能需要尝试一下。根据代码库的不同,将整个代码转换为利用多个线程可能需要很多工作,因此您可能需要尝试将多线程应用于您知道IO/本机代码正在被调用的部分,并度量是否有任何改进。
根据您的用例,多处理可能适用于主要受CPU约束的情况。多处理确实增加了开销,因此对于持续时间相对较长(几秒或更长)的CPU绑定任务来说,这通常是一种很好的方法。
https://stackoverflow.com/questions/42378491
复制相似问题