例:
image = Image.open('foo.png')
# releases the GIL?
resized = image.resize((800, 600), Image.ANTIALIAS)
# reacquires the GIL?
明らかに、変数の割り当ては GIL を保持する必要がありますが、それを 2 行に分割するのは困難です。:)
画像のサイズ変更を行う 2 つのスレッドがある場合、それらのサイズ変更を 2 つの異なるコアで実行できますか?
例:
image = Image.open('foo.png')
# releases the GIL?
resized = image.resize((800, 600), Image.ANTIALIAS)
# reacquires the GIL?
明らかに、変数の割り当ては GIL を保持する必要がありますが、それを 2 行に分割するのは困難です。:)
画像のサイズ変更を行う 2 つのスレッドがある場合、それらのサイズ変更を 2 つの異なるコアで実行できますか?
1.1.7 のソースを見ると、 の GIL がリリースされていないようです_resize
。
GIL を解放する機能は次のようです。
PyImaging_CreateWindowWin32 (createwindow on Win32)
PyImaging_EventLoopWin32 (eventloop on Win32)
pyCMSdoTransform (apply)
_buildTransform (buildTransform)
_buildProofTransform (buildProofTransform)
_encode_to_file (encode_to_file)
GILのPythonwikiから:
I / O、画像処理、NumPy番号の処理など、ブロックまたは長時間実行される可能性のある操作は、GILの外部で発生することに注意してください。したがって、GILがボトルネックになるのは、CPythonバイトコードを解釈してGIL内で多くの時間を費やすマルチスレッドプログラムでのみです。
PILは、C拡張機能を使用して、手間のかかる作業のほとんどを実行します。したがって、実際の画像のサイズ変更では、該当する場合はマルチスレッドを利用する必要があります。
複数の画像のサイズ変更を同時に行う場合は、Pythonのネイティブマルチプロセッシングライブラリの使用を検討することをお勧めします。これにより、複数のコアを使用するという望ましい効果が得られるはずです。