PIL调整大小()是否持有GIL?

时间:2012-11-05 23:41:33

标签: python python-imaging-library cpython

示例:

image = Image.open('foo.png')
# releases the GIL?
resized = image.resize((800, 600), Image.ANTIALIAS)
# reacquires the GIL?

显然,变量赋值需要保持GIL,但很难将其分为两行。 :)

如果有两个线程正在进行图像调整大小,那么这些调整大小可以在两个不同的内核上运行吗?

2 个答案:

答案 0 :(得分:3)

查看1.1.7的来源,它似乎不会释放_resize的GIL。

释放GIL的功能似乎是:

PyImaging_CreateWindowWin32 (createwindow on Win32)
PyImaging_EventLoopWin32 (eventloop on Win32)
pyCMSdoTransform (apply)
_buildTransform (buildTransform)
_buildProofTransform (buildProofTransform)
_encode_to_file (encode_to_file)

答案 1 :(得分:1)

来自Python wiki on the GIL

  

请注意可能阻塞或长时间运行的操作,例如   I / O,图像处理和NumPy数字运算都发生在外面   GIL。因此,只有在多线程程序中花费很多   GIL内部的时间,解释CPython字节码,即GIL   成为瓶颈。

PIL使用C扩展来完成大部分繁重的工作。因此,实际的图像大小调整应该利用多线程(如果适用)。

如果您要求同时调整多个图像的大小,我建议您考虑使用Python的原生multiprocessing库。这应该实现使用多个核的期望效果。