示例:
image = Image.open('foo.png')
# releases the GIL?
resized = image.resize((800, 600), Image.ANTIALIAS)
# reacquires the GIL?显然,变量赋值需要保存GIL,但很难将其分成两行。:)
如果有两个线程执行图像大小调整,那么这些大小调整可以在两个不同的内核上运行吗?
发布于 2012-12-11 11:00:33
看一下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)发布于 2012-11-06 08:51:33
在Python wiki on the GIL中:
请注意,潜在的阻塞或长时间运行的操作,如I/O、图像处理和NumPy数字处理,发生在GIL之外。因此,只有在花费大量时间在GIL中解释CPython字节码的多线程程序中,GIL才会成为瓶颈。
PIL使用C扩展来完成大部分繁重的任务。因此,如果适用的话,实际的图像调整应该利用多线程。
如果您正在询问如何同时调整多个图像的大小,我建议您考虑使用Python的原生multiprocessing库。这应该会达到使用多核的预期效果。
https://stackoverflow.com/questions/13242221
复制相似问题