示例:
image = Image.open('foo.png')
# releases the GIL?
resized = image.resize((800, 600), Image.ANTIALIAS)
# reacquires the GIL?
显然,变量赋值需要保持GIL,但很难将其分为两行。 :)
如果有两个线程正在进行图像调整大小,那么这些调整大小可以在两个不同的内核上运行吗?
答案 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)
请注意可能阻塞或长时间运行的操作,例如 I / O,图像处理和NumPy数字运算都发生在外面 GIL。因此,只有在多线程程序中花费很多 GIL内部的时间,解释CPython字节码,即GIL 成为瓶颈。
PIL使用C扩展来完成大部分繁重的工作。因此,实际的图像大小调整应该利用多线程(如果适用)。
如果您要求同时调整多个图像的大小,我建议您考虑使用Python的原生multiprocessing库。这应该实现使用多个核的期望效果。