ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΅Π½ Python Global Interpreter Lock ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠΠ²Ρ‚ΠΎΡ€ΠΈΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΅Π½ Python Global Interpreter Lock ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

Python Global Interpreter Lock (GIL) β€” это своСобразная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ Python. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

Π Π°Π±ΠΎΡ‚Π° GIL ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсущСствСнной для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Но Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… отсутствиС GIL ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ процСссоро-зависымых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ GIL позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π΄Π°ΠΆΠ΅ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΎΠ½ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ†ΠΈΡŽ Β«ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ извСстной» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ рассказано ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ GIL влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ это самоС влияниС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ.

Π§Ρ‚ΠΎ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² Python Ρ€Π΅ΡˆΠ°Π΅Ρ‚ GIL?

Python подсчитываСт количСство ссылок для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ созданныС Π² Python ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ подсчёта ссылок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится количСство всСх ссылок Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эта пСрСмСнная становится Ρ€Π°Π²Π½ΠΎΠΉ Π½ΡƒΠ»ΡŽ, ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная ΠΏΠΎΠ΄ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, освобоТдаСтся.

Π’ΠΎΡ‚ нСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… подсчёта ссылок:

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ GIL, связана с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ сразу нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ значСния этого счётчика ссылок. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ очистится Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈ удалится Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Ρ‘ сущСствуСт ссылка.

Π‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊ ссылок ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π° всС структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎ нСскольким ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС счётчик Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Но Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΊ нСскольким ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ появлСнию Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ β€” Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (Π°Π½Π³Π». deadlocks), которая получаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΠΎΠΆΠ΅ сниТала Π±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·-Π·Π° ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΉ установки Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

GIL β€” эта ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ΠΎΡ€ самого ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python. Он добавляСт ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: любоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° Π² Python Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Ρ‚. ΠΊ. GIL Π±ΡƒΠ΄Π΅Ρ‚ СдинствСнной Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π΅Π³ΠΎ влияниС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ процСссора совсСм Π½Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ. Однако стоит ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ GIL ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π»ΡŽΠ±ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ.

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ GIL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Ruby, ΠΎΠ½ Π½Π΅ являСтся СдинствСнным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. НСкоторыС языки Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ потокобСзопасного освобоТдСния памяти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сборки мусора.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ языки часто Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… прСимущСств GIL Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ JIT-компиляторов.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ GIL?

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ это Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Β«Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅Β» Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Python? Насколько для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ?

По словам Larry Hastings, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ GIL β€” это ΠΎΠ΄Π½Π° ΠΈΠ· Ρ‚Π΅Ρ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сдСлали Python популярным.

Python сущСствуСт с Ρ‚Π΅Ρ… Π²Ρ€Π΅ΠΌΡ‘Π½, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Π½Π΅ сущСствовало понятия ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. Π­Ρ‚ΠΎΡ‚ язык разрабатывался Π² расчётС Π½Π° Π»Ρ‘Π³ΠΊΠΎΠ΅ использованиС ΠΈ ускорСниС процСсса Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Всё большС ΠΈ большС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠ»ΠΎ Π½Π° Python.

Много Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нуТдался Python, Π±Ρ‹Π»ΠΎ написано для ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π° C. Для прСдотвращСния нСсогласованных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, язык C Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π» потокобСзопасного управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ смог ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ GIL.

GIL ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Python. Он ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π» ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вСлось Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

Π’Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π° C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ потокобСзопасными, стало Π»Π΅Π³Ρ‡Π΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° C стали ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Python-сообщСство стало Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒΡΡ.

Как ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, GIL β€” фактичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ CPython Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΆΠΈΠ·Π½ΠΈ Python.

ВлияниС GIL Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния

Если ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ‚ΠΈΠΏΠΈΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π½Π° Python) β€” Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π°, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° Π»ΠΈ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ процСссора ΠΈΠ»ΠΈ ΠΆΠ΅ I/O.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ процСссора (Π°Π½Π³Π». CPU-bound) β€” это всС Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, поиск, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Ρ‚. Π΄.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ I/O (Π°Π½Π³Π». I/O-bound) β€” это Ρ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто находятся Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΡ‚ источников Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° (ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Ρ„Π°ΠΉΠ», Π‘Π”, ΡΠ΅Ρ‚ΡŒ). Π’Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΆΠ΄Π°Ρ‚ΡŒ Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΎΡ‚ источника Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ источник ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ собствСнныС (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅) ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² Π²Ρ‹Π΄Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. НапримСр, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ Π½Π°Π΄ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ввСсти Π² ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡƒΡŽ строку ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΊΠ°ΠΊΠΎΠΉ запрос ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² Π‘Π”.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° простая CPU-bound ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая попросту Π²Π΅Π΄Ρ‘Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ отсчёт:

Запустив это Π½Π° 4Ρ…-ядСрном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‚Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, с нСбольшим ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ отсчёт вСдётся Π² Π΄Π²ΡƒΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…:

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π·Π°Ρ‚Ρ€Π°Ρ‚ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ врСмя. Π’ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ вСрсии GIL ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΠ» ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

GIL Π½Π΅ сильно влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ I/O-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, Ρ‚. ΠΊ. Π² процСссС оТидания ΠΎΡ‚ I/O Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° распространяСтся ΠΏΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ.

Однако ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ с процСссором (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° изобраТСния ΠΏΠΎ частям), ΠΈΠ·-Π·Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ станСт ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ, Π½ΠΎ ΠΈ Π½Π° Π΅Ρ‘ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ Ссли Π±Ρ‹ ΠΎΠ½Π° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π»Π° строго ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ.

Π’Π°ΠΊΠΎΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ β€” это Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ появлСния ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ GIL всё Π΅Ρ‰Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚?

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ языка ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΡƒΠΉΠΌΡƒ ΠΆΠ°Π»ΠΎΠ± ΠΊΠ°ΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ GIL. Но Ρ‚Π°ΠΊΠΎΠΉ популярный язык ΠΊΠ°ΠΊ Python Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ провСсти Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ GIL, вСдь это, СстСствСнно, ΠΏΠΎΠ²Π»Π΅Ρ‡Ρ‘Ρ‚ Π·Π° собой ΠΊΡƒΡ‡Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ нСсовмСстимости.

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Π±Ρ‹Π»ΠΈ прСдприняты ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ удалСния GIL. Но всС эти ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ°Π»ΠΈΡΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ Π½Π° C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ»ΠΎΡ‚Π½ΠΎ зависСли ΠΎΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… GIL-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. ЕстСствСнно, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, схоТиС с GIL. Однако ΠΎΠ½ΠΈ Π»ΠΈΠ±ΠΎ ΡΠ½ΠΈΠΆΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… I/O-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π»ΠΈΠ±ΠΎ попросту слоТны Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’Π°ΠΌ Π±Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½ΠΎΠ²Ρ‹Ρ… вСрсиях ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅ΠΉ, Ρ‡Π΅ΠΌ сСйчас, вСдь Ρ‚Π°ΠΊ?

Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ Python, Guido van Rossum, Π² сСнтябрС 2007 Π³ΠΎΠ΄Π° высказался ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ этого Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Β«It isn’t Easy to remove the GILΒ»:

Β«Π― Π±Ρ‹Π» Π±Ρ‹ Ρ€Π°Π΄ ΠΏΠ°Ρ‚Ρ‡Π°ΠΌ Π² Py3k Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… I/O-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π»Π°ΡΡŒ.Β»

Π‘ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· прСдпринятых ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Π½Π΅ удовлСтворяла это условиС.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ GIL Π½Π΅ Π±Ρ‹Π» ΡƒΠ΄Π°Π»Ρ‘Π½ Π² Python 3?

Python 3 Π½Π° самом Π΄Π΅Π»Π΅ ΠΈΠΌΠ΅Π» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»ΠΊΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с нуля, хотя ΠΈΠ·-Π·Π° этого ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° Π‘ попросту сломались Π±Ρ‹ ΠΈ ΠΈΡ… ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ. ИмСнно ΠΈΠ·-Π·Π° этого ΠΏΠ΅Ρ€Π²Ρ‹Π΅ вСрсии Python 3 Ρ‚Π°ΠΊ слабо Ρ€Π°ΡΡ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ ΠΏΠΎ сообщСству.

Но ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ с ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ Python 3 Π½Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ GIL?

Π•Π³ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ сдСлаСт ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π² Python 3 ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅ΠΉ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Python 2 ΠΈ просто ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Π²ΠΎ Ρ‡Ρ‚ΠΎ это Π²Ρ‹Π»ΡŒΠ΅Ρ‚ΡΡ. НСльзя Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ прСимущСства однопоточности Π² GIL. ИмСнно поэтому ΠΎΠ½ всё Π΅Ρ‰Ρ‘ Π½Π΅ ΡƒΠ΄Π°Π»Ρ‘Π½.

Но Π² Python 3 Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ появились ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ для ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ GIL. Π”ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΎΡΡŒ ΠΎ влиянии GIL Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ процСссор ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ I/O. А Ρ‡Ρ‚ΠΎ насчёт Ρ‚Π΅Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ΄ΡƒΡ‚ Π½Π° процСссор, Π° Ρ‡Π°ΡΡ‚ΡŒ Π½Π° I/O?

Π’ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… I/O-ΠΏΠΎΡ‚ΠΎΠΊΠΈ Β«ΡΡ‚Ρ€Π°Π΄Π°ΡŽΡ‚Β» ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… Π½Π΅Ρ‚ доступа ΠΊ GIL ΠΎΡ‚ процСссорных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π­Ρ‚ΠΎ связано со встроСнным Π² Python ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°Π» ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ GIL послС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ использования. Π’ случаС, Ссли Π½ΠΈΠΊΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ GIL, эти ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Но Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. ΠŸΠΎΡ‡Ρ‚ΠΈ всСгда GIL занимаСтся процСссорными ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΡƒΡΠΏΠ΅Π²Π°ΡŽΡ‚ Π·Π°Π½ΡΡ‚ΡŒ мСсто. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚ Π±Ρ‹Π» ΠΈΠ·ΡƒΡ‡Π΅Π½ David Beazley, Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этого ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ здСсь.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° Ρ€Π΅ΡˆΠ΅Π½Π° Π² Python 3.2 Π² 2009 Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ Antoine Pitrou. Он Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ подсчёта ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² GIL. И Ссли Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² GIL, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π» Π±Ρ‹ ΠΈΡ… мСсто.

Как ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ GIL?

Если GIL Ρƒ вас Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π²ΠΎΡ‚ нСсколько Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ:

ПослС запуска ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ вСрсиСй. Однако ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ снизился Π΄ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹. Всё ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссами само ΠΏΠΎ сСбС сказываСтся Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. НСсколько процСссов Π±ΠΎΠ»Π΅Π΅ слоТны, Ρ‡Π΅ΠΌ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², поэтому с Π½ΠΈΠΌΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ Python. Π£ Python Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ². CPython, Jyton, IronPython ΠΈ PyPy, написанныС Π½Π° C, Java, C# ΠΈ Python соотвСтствСнно. GIL сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ β€” Π½Π° CPython.

Π’Ρ‹ просто ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСимущСства однопоточности, Π² Ρ‚ΠΎ врСмя, ΠΏΠΎΠΊΠ° ΠΎΠ΄Π½ΠΈ ΠΈΠ· самых ярких ΡƒΠΌΠΎΠ² прямо сСйчас Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π°Π΄ устранСниСм GIL ΠΈΠ· CPython. Π’ΠΎΡ‚ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ.

Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ, GIL рассматриваСтся ΠΊΠ°ΠΊ Π½Π΅Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ слоТноС ΠΈ нСпонятноС. Но ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π²Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊ python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½Ρ‘Ρ‚Π΅ΡΡŒ с GIL Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° C ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ процСссорныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

На этом этапС Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ всС аспСкты, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с GIL. Если ΠΆΠ΅ Π²Π°ΠΌ интСрСсна низкоуровнСвая структура GIL β€” посмотритС Understanding the Python GIL ΠΎΡ‚ David Beazley.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (GIL) ΠΈ Π΅Ρ‘ воздСйствиС Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π² Python

Как Π²Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π·Π½Π°Π΅Ρ‚Π΅, глобальная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (GIL, Global Interpreter Lock) β€” это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ, ΠΏΡ€ΠΈ использовании ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° CPython, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Но ΠΈΠ·-Π·Π° GIL Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python ΠΌΠΎΠΆΠ΅Ρ‚ лишь ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ нСльзя ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Python-ΠΊΠΎΠ΄, интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ рСсурсы процСссора, распрСдСлив Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΠΎ нСскольким ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. НСгативноС влияниС GIL Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Python-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΏΡ€Π°Π²Π΄Π°, Π½Π° этом Π½Π΅ заканчиваСтся. Π’Π°ΠΊ, GIL создаёт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° систСму. Π­Ρ‚ΠΎ замСдляСт ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ, Ρ‡Ρ‚ΠΎ выглядит достаточно Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ влияниС Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° подсистСмой Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

ΠŸΡ€ΠΈΠΌ. Wunder Fund: Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассказано, Π·Π°Ρ‡Π΅ΠΌ появилась ΠΈ сущСствуСт глобальная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅, ΠΊΠ°ΠΊ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½Π° влияСт Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠŸΠΈΡ‚ΠΎΠ½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΡƒΠ΄Π° Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠŸΠΈΡ‚ΠΎΠ½. Π£ нас Π² Ρ„ΠΎΠ½Π΄Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ всё, Ρ‡Ρ‚ΠΎ Π½Π΅ написано Π½Π° ΠΏΠ»ΡŽΡΠ°Ρ… β€” написано Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅, ΠΌΡ‹ ΠΏΡ€ΠΈΡΡ‚Π°Π»ΡŒΠ½ΠΎ слСдим Π·Π° Ρ‚Π΅ΠΌ, ΠΊΡƒΠ΄Π° двиТСтся язык, ΠΈ Ссли Π²Ρ‹ Ρ‚ΠΎΠΆΠ΅ β€” Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ )

Π—Π΄Π΅ΡΡŒ я ΠΎΠΏΠΈΡ€Π°ΡŽΡΡŒ Π½Π° особСнности CPython 3.9. По ΠΌΠ΅Ρ€Π΅ развития CPython Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ GIL, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎ, измСнятся. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ 22 сСнтября 2021 Π³ΠΎΠ΄Π°, послС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² Π½Π΅Π³ΠΎ внСсСно нСсколько Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, ΠΏΠΎΡ‚ΠΎΠΊΠΈ Python ΠΈ GIL

ВрСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исполнСниС Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. ΠŸΠΎΡ‚ΠΎΠΊ, Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°, провСряСт, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ для остановки выполнСния Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. Нам интСрСсна ΠΎΠ΄Π½Π° ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½, которая Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ…ΠΎΡ‡Π΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ GIL. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это всё Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΠΊΠΎΠ΄Π΅:

Π’ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ Python-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ β€” это Π΅Ρ‰Ρ‘ ΠΈ СдинствСнный ΠΏΠΎΡ‚ΠΎΠΊ. Он Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ освобоТдаСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. А Ρ‡Ρ‚ΠΎ ΠΆΠ΅ происходит Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…? Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ стандартным ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ threading для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ Python-ΠΏΠΎΡ‚ΠΎΠΊΠ°:

БобствСнно говоря, это β€” Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ свСдСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ GIL. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ GIL влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Python-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Если Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, покаТСтся Π²Π°ΠΌ интСрСсным, вас ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ части этой ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π³Π΄Π΅ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ аспСкты GIL.

ΠŸΠΎΡΠ»Π΅Π΄ΡΡ‚Π²ΠΈΡ сущСствования GIL

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ послСдствиС сущСствования GIL ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстно: это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния Python-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². А Π·Π½Π°Ρ‡ΠΈΡ‚ β€” ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π΄Π°ΠΆΠ΅ Π½Π° многоядСрных ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π΅ быстрСС, Ρ‡Π΅ΠΌ ΠΈΡ… ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ эквивалСнты.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ зависит ΠΎΡ‚ скорости процСссора. Она выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство Ρ€Π°Π·:

ΠœΡ‹, Π½Π΅ мудрствуя Π»ΡƒΠΊΠ°Π²ΠΎ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°ΡΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Python-ΠΊΠΎΠ΄Π°.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ 100,000,000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ дСкрСмСнтирования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ countdown(100_000_000) Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΈΠ»ΠΈ countdown(50_000_000) Π² Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, ΠΈΠ»ΠΈ countdown(25_000_000) Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’ языках, Π³Π΄Π΅ Π½Π΅Ρ‚ GIL, Π²Ρ€ΠΎΠ΄Π΅ C, ΠΌΡ‹, увСличивая число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², смогли Π±Ρ‹ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ускорСниС вычислСний. Π― запустил Python-ΠΊΠΎΠ΄ Π½Π° своём MacBook Pro. Π’ ΠΌΠΎΡ‘ΠΌ распоряТСнии Π±Ρ‹Π»ΠΈ Π΄Π²Π° ядра ΠΈ тСхнология hyper-threading. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Ρƒ мСня ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ дСкрСмСнтирования Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ (n)

ВрСмя Π² сСкундах (Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3 ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ)

Бколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΡ‹ Π½Π΅ использовали Π±Ρ‹, врСмя выполнСния вычислСний, Π² сущности, остаётся ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅. На самом Π΄Π΅Π»Π΅, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π΄Π°ΠΆΠ΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΈΠ·-Π·Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° систСму, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ опСрациями ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ составляСт 5 мс, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π΅ слишком часто. Но Ссли ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ этот ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π», ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НиТС ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, Π·Π°Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π₯отя использованиС Python-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ Π² Π΄Π΅Π»Π΅ ускорСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… рСсурсы процСссора, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ принСсти ΠΏΠΎΠ»ΡŒΠ·Ρƒ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ мноТСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… привязана ΠΊ подсистСмС Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ сСбС сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ входящих ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ клиСнтская систСма, запускаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π­Ρ‚Π° функция «общаСтся» с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, считывая Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· клиСнтского сокСта ΠΈ записывая Π΄Π°Π½Π½Ρ‹Π΅ Π² сокСт. ΠŸΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… функция бСздСйствуСт Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΅ΠΉ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚. ИмСнно Π² ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ситуациях ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ оказываСтся ΠΎΡ‡Π΅Π½ΡŒ кстати: ΠΏΠΎΠΊΠ° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ бСздСйствуСт, Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π² Ρ‚ΠΎ врСмя, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ, ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ GIL, ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Π² CPython всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ с использованиСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°:

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ…ΡΡˆΠΈ SHA-256 для восьми 128-ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π½Ρ‹Ρ… сообщСний. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ hashlib.sha256(message) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния, обойдясь ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΠΎ нСскольким ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ исслСдования этой Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° ΠΌΠΎΡ‘ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠžΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСний Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ

ВрСмя Π² сСкундах (Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3 ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ)

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊ Π΄Π²ΡƒΠΌ Π΄Π°Ρ‘Ρ‚ ускорСниС ΠΏΠΎΡ‡Ρ‚ΠΈ Π² 2 Ρ€Π°Π·Π° ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ эти Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€Π°Π²Π΄Π°, дальнСйшСС ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ особСнно сильно ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π° ΠΌΠΎΡ‘ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ всСго Π΄Π²Π° физичСских процСссорных ядра. Π’ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΠ² ΠΊ многопоточности, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Python-ΠΊΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ «тяТёлыС» вычислСния, Π² Ρ‚ΠΎΠΌ случаС, Ссли Π² этом ΠΊΠΎΠ΄Π΅ осущСствляСтся Π²Ρ‹Π·ΠΎΠ² C-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ GIL. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Π½ΠΎ ΠΈ Π² модулях сторонних Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², рассчитанных Π½Π° ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹Π΅ вычислСния, Π²Ρ€ΠΎΠ΄Π΅ NumPy. МоТно Π΄Π°ΠΆΠ΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ GIL.

ΠœΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… привязана ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ CPU, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ β€” ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, заняты Π½Π΅ΠΊΠΈΠΌΠΈ вычислСниями. ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΈ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° подсистСмой Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° β€” ΠΎ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ заняты ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Π‘Π°ΠΌΡ‹Π΅ интСрСсныС послСдствия сущСствования GIL ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ смСшанном использовании ΠΈ Ρ‚Π΅Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Рассмотрим простой эхо-сСрвСр TCP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ входящих ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Когда ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ β€” ΠΎΠ½ запускаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с этим ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ:

Бколько запросов Π² сСкунду «потянСт» этот сСрвСр? Π― написал ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ-ΠΊΠ»ΠΈΠ΅Π½Ρ‚, которая, Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ быстро, насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, отправляСт сСрвСру 1-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ сообщСния ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΡ… ΠΎΡ‚ Π½Π΅Π³ΠΎ. Π£ мСня ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 30 тысяч запросов Π² сСкунду (RPS, Requests Per Second). Π­Ρ‚ΠΎ, скорСС всСго, Π½Π΅ особСнно Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈ сСрвСр, ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Но Ρ‚ΡƒΡ‚ ΠΊ надёТности этого Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° я ΠΈ Π½Π΅ стрСмился. А интСрСсовало мСня Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΡƒΠΏΠ°Π΄Ρ‘Ρ‚ RPS Π² Ρ‚ΠΎΠΌ случаС, Ссли сСрвСр Π±ΡƒΠ΄Π΅Ρ‚, Π²ΠΎ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΡƒΡŽ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ.

Рассмотрим Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый сСрвСрный ΠΊΠΎΠ΄, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠΎΠ΄, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, устроСнный довольно ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎ. Код, выполняСмый Π² этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² бСсконСчном Ρ†ΠΈΠΊΠ»Π΅ (ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ любого ΠΊΠΎΠ΄Π°, интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ рСсурсы процСссора, Π² сущности, происходит Ρ‚ΠΎ ΠΆΠ΅ самоС):

Как Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ β€” насколько сильно измСнится RPS? Π£ΠΏΠ°Π΄Ρ‘Ρ‚ лишь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ? Или, ΠΌΠΎΠΆΠ΅Ρ‚, снизится Π² 2 Ρ€Π°Π·Π°? А ΠΌΠΎΠΆΠ΅Ρ‚ β€” Π² 10? НСт. ΠŸΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ RPS ΡƒΠΏΠ°Π» Π΄ΠΎ 100, Ρ‡Ρ‚ΠΎ Π² 300 Ρ€Π°Π· мСньшС ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ показатСля. И это ΠΊΡ€Π°ΠΉΠ½Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊ ΠΊ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ опСрационная систСма ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я имСю Π² Π²ΠΈΠ΄Ρƒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ запустим ΠΊΠΎΠ΄ сСрвСра ΠΈ ΠΊΠΎΠ΄ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎ вычислСния, Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… процСссов, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π° Π½ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ GIL. МоТно Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°, ΠΈΠ»ΠΈ просто Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартным ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ multiprocessing для создания Π½ΠΎΠ²Ρ‹Ρ… процСссов. НапримСр, это ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΠΊΠΎΠ»ΠΎ 20 тысяч RPS. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Π²Π°, Ρ‚Ρ€ΠΈ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ процСсса, интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… процСссор, RPS ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ мСняСтся. ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ОБ ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ процСссам, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… привязана ΠΊ подсистСмС Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. И это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сСрвСрного ΠΊΠΎΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊ, привязанный ΠΊ подсистСмС Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° сокСт Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ ΠΈ записи, Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡ…ΡƒΠ΄ΡˆΠ°Ρ‚ΡŒΡΡ ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ сСбС ΠΏΠΎΡ‚ΠΎΠΊ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°. Он, Ссли рядом с Π½ΠΈΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ, интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ процСссор, Π±ΡƒΠ΄Π΅Ρ‚ рСгулярно Β«ΠΏΠΎΠ΄Π²ΠΈΡΠ°Ρ‚ΡŒΒ». Ясно, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π΅ Ρ‚Π°ΠΊ, ΠΈ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этого являСтся GIL. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ОБ.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ CPython, Π½Π° самом Π΄Π΅Π»Π΅, Ρ…ΠΎΡ€ΠΎΡˆΠΎ освСдомлСны ΠΎΠ± этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅. Они Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΅Ρ‘ «эффСктом сопровоТдСния» (convoy effect). Дэвид Π‘ΠΈΠ·Π»ΠΈ сдСлал ΠΎΠ± этом Π΄ΠΎΠΊΠ»Π°Π΄ Π² 2010 Π³ΠΎΠ΄Ρƒ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π» ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π½Π° bugs.python.org. Π§Π΅Ρ€Π΅Π· 11 Π»Π΅Ρ‚, Π² 2021 Π³ΠΎΠ΄Ρƒ, это ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ. Но ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π±Ρ‹Π»Π° исправлСна. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ попытаСмся Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ‚Π°ΠΊ.

Π­Ρ„Ρ„Π΅ΠΊΡ‚ сопровоТдСния

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°, привязанного ΠΊ возмоТностям CPU, сразу ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ, привязанный ΠΊ Π²Π²ΠΎΠ΄Ρƒ/Π²Ρ‹Π²ΠΎΠ΄Ρƒ, освободит GIL. А Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°, зависящСго ΠΎΡ‚ подсистСмы Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, поэтому Ρƒ Π½Π΅Π³ΠΎ мСньшС шансов ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ GIL. Если опСрация Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° являСтся ΠΏΠΎ-настоящСму быстрой, скаТСм β€” это Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° send(), Ρ‚ΠΎ ΡˆΠ°Π½ΡΡ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° Π·Π°Ρ…Π²Π°Ρ‚ GIL, Π½Π° самом Π΄Π΅Π»Π΅, довольно-Ρ‚Π°ΠΊΠΈ высоки, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° одноядСрном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π³Π΄Π΅ ОБ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΅ΠΉ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

На многоядСрных ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… ОБ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠ· этих Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² трСбуСтся Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Она ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΈΡ… этих ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ядрах. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ окаТСтся, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ привязана ΠΊ CPU, ΠΏΠΎΡ‡Ρ‚ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ GIL, Π° Π½Π° ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, выполняСмой Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, привязанном ΠΊ подсистСмС Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ 5 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… миллисСкунд.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°ΡŽΡ‚ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ GIL, ΠΆΠ΄Ρ‘Ρ‚ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊ, привязанный ΠΊ подсистСмС Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ GIL послС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Если Π±Ρ‹ этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π½Π΅ сущСствовало, послСдствия эффСкта сопровоТдСния Π±Ρ‹Π»ΠΈ Π±Ρ‹ Π΅Ρ‰Ρ‘ Ρ…ΡƒΠΆΠ΅.

А 5 мс β€” ΠΌΠ½ΠΎΠ³ΠΎ это ΠΈΠ»ΠΈ ΠΌΠ°Π»ΠΎ? Π­Ρ‚ΠΎ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Если ΠΏΠΎΡ‚ΠΎΠΊ нСсколько сСкунд ΠΆΠ΄Ρ‘Ρ‚ появлСния Π² сокСтС Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ 5 мс особой Ρ€ΠΎΠ»ΠΈ Π½Π΅ ΡΡ‹Π³Ρ€Π°ΡŽΡ‚. Но Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ быстро. НапримСр, ΠΊΠΎΠΌΠ°Π½Π΄Π° send() выполняСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΡ„Π΅Ρ€ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠΎΠ»ΠΎΠ½, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС осущСствляСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Π½Π΅Ρ‘. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ссли Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ микросСкунды, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ миллисСкунды оТидания GIL ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ влияниС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Наш эхо-сСрвСр Π±Π΅Π· ΠΏΠΎΡ‚ΠΎΠΊΠ°, сильно Π½Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ процСссор, способСн ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ 30 тысяч запросов Π² сСкунду. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ запроса Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 1/30000 = 30 мкс. А Ссли Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ сСрвСрС с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, привязанным ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ процСссора, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ recv() ΠΈ send() Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚, каТдая, ΠΏΠΎ 5 мс (5000 мкс) ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ запроса трСбуСтся 10030 мкс. Π­Ρ‚ΠΎ β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 300 Ρ€Π°Π· большС, Ρ‡Π΅ΠΌ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ пропускная ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ сСрвСра ΠΏΠ°Π΄Π°Π΅Ρ‚ Π² 300 Ρ€Π°Π·. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, эти Ρ†ΠΈΡ„Ρ€Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

Π’ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒΡΡ вопросом ΠΎ Ρ‚ΠΎΠΌ, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ эффСкта сопровоТдСния ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… прилоТСниях. ΠžΡ‚Π²Π΅Ρ‚Π° Π½Π° этот вопрос я Π½Π΅ знаю. Π― Π½ΠΈΠΊΠΎΠ³Π΄Π° с ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π½Π΅ сталкивался ΠΈ Π½Π΅ встрСчал ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π² Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ сталкивался ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘. Никто Π½Π° это Π½Π΅ ТалуСтся, ΠΈ это β€” ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ данная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ исправлСна.

Но Ρ‡Ρ‚ΠΎ Ссли эффСкт сопровоТдСния Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ вашСго прилоТСния? Π•ΡΡ‚ΡŒ Π΄Π²Π° способа исправлСния этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

УстранСниС послСдствий эффСкта сопровоТдСния

Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² сСкундах

RPS Π±Π΅Π· CPU-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

RPS с ΠΎΠ΄Π½ΠΈΠΌ CPU-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ

RPS с двумя CPU-ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ

RPS с Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ CPU-ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Как устроСн GIL Π² Python

ΠŸΠΎΡ‡Π΅ΠΌΡƒ послС распараллСливания Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒΡΡ Π²Π΄Π²ΠΎΠ΅?
ΠŸΠΎΡ‡Π΅ΠΌΡƒ послС создания ΠΏΠΎΡ‚ΠΎΠΊΠ° пСрСстаСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ctrl-C?
ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ David Beazley Β«Inside the Python GILΒ». Π’ Π½Π΅ΠΉ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тонкости Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов Π² Python.

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

ВступлСниС

Как извСстно, Π² Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ глобальная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (Global Interpreter Lock β€” GIL), Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ. А ΠΈΠΌΠ΅Π½Π½ΠΎ, нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько процСссоров ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π­Ρ‚ΠΎ избитая Ρ‚Π΅ΠΌΠ° для Ρ…ΠΎΠ»ΠΈΠ²Π°Ρ€ΠΎΠ² ΠΎ Python, наряду с tail-call ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, lambda, whitespace ΠΈ Ρ‚. Π΄.

ДисклСймСр

Π― Π½Π΅ ΠΈΡΠΏΡ‹Ρ‚Ρ‹Π²Π°ΡŽ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ возмущСния ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ использования GIL Π² Python. Но для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний с использованиСм Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… CPU я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ сообщСний ΠΈ мСТпроцСссноС взимодСйствиС использованию ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Однако мСня интСрСсуСт Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ GIL Π½Π° многоядСрных процСссорах.

ВСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Рассмотрим Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ CPU-Π·Π°Π²ΠΈΡΠΈΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Ρ‚.Π΅. Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ зависит прСимущСствСнно ΠΎΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ процСссора):

Π‘Π½Π°Ρ‡Π°Π»Π° запустим Π΅Π΅ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ запустим Π΅Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π² Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…:

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…

Python threads β€” это настоящиС ΠΏΠΎΡ‚ΠΎΠΊΠΈ (POSIX threads ΠΈΠ»ΠΈ Windows threads), ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ОБ. Рассмотрим ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² процСссС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python (написанного Π½Π° C). ΠŸΡ€ΠΈ создании ΠΏΠΎΡ‚ΠΎΠΊ просто выполняСт ΠΌΠ΅Ρ‚ΠΎΠ΄ run() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Thread ΠΈΠ»ΠΈ Π»ΡŽΠ±ΡƒΡŽ Π·Π°Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

На самом Π΄Π΅Π»Π΅ происходит Π³ΠΎΡ€Π°Π·Π΄ΠΎ большСС. Python создаСт ΠΌΠ°Π»Π΅Π½ΡŒΠΊΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… (PyThreadState), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Π½Ρ‹: Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ stack frame Π² ΠΊΠΎΠ΄Π΅ Python, тСкущая Π³Π»ΡƒΠ±ΠΈΠ½Π° рСкурсии, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°, нСкоторая информация ΠΎΠ± ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ…. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ΅Π½Π΅Π΅ 100 Π±Π°ΠΉΡ‚. Π—Π°Ρ‚Π΅ΠΌ запускаСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (pthread), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ΄ Π½Π° языкС C Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ PyEval_CallObject, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Python callable.

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. ВыполняСмыС дСйствия всСцСло зависят ΠΎΡ‚ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

ΠŸΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ извСстный GIL

Π’ этом вся Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ°: Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Python. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° β€” GIL β€” Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π΄ΠΎΠ². GIL Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹ΠΉ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ).

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прост. ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ GIL, ΠΏΠΎΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ. Однако ΠΎΠ½ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΠΆΠ΄Π°Ρ‚ΡŒ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ свой шанс Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ.

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с CPU-зависимыми ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ производят ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ пСриодичСски ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ (Β«the periodic checkΒ»).

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это происходит ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 100 Β«Ρ‚ΠΈΠΊΠΎΠ²Β», Π½ΠΎ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sys.setcheckinterval(). Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ β€” Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ счСтчик, Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ нСзависимый ΠΎΡ‚ порядка ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

ΠŸΡ€ΠΈ пСриодичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов, Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ. Π—Π°Ρ‚Π΅ΠΌ GIL ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ вновь. На этом этапС обСспСчиваСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… CPU-зависимых ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (ΠΏΡ€ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΌ освобоТдСнии GIL Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Ρ€Π΅Π΄Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ шанс Π½Π° запуск).

Π’ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ инструкций ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Они Π½Π΅ ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ЀактичСски, длинная опСрация ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всё:

Π’ΠΈΠΊΠΈ нСльзя ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ, Ctrl-C Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π΅ остановит Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹

Когда поступаСт сигнал, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ запускаСт Β«checkΒ» послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΊΠ°, ΠΏΠΎΠΊΠ° Π½Π΅ запустится Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ часто Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ GIL, ΠΏΠΎΠΊΠ° Π½Π΅ запустится Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Π£ Python Π½Π΅Ρ‚ срСдств для опрСдСлСния, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ. НСт ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ многозадачности, round-robin ΠΈ Ρ‚.ΠΏ. Π­Ρ‚Π° функция Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ возлагаСтся Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ странной Ρ€Π°Π±ΠΎΡ‚Ρ‹ сигналов: ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запуск ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠ½ просто ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΡ… ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π°Ρ‰Π΅, надСясь, Ρ‡Ρ‚ΠΎ запустится Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

Ctrl-C часто Π½Π΅ срабатываСт Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ thread-join ΠΈΠ»ΠΈ lock. Пока ΠΎΠ½ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΎΠ½ Π½Π΅ смоТСт Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ. Как слСдствиС, ΠΎΠ½ Π½Π΅ смоТСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала.

Π’ качСствС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ бонуса, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ остаСтся Π² состоянии, Π³Π΄Π΅ ΠΎΠ½ пытаСтся ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΊΠ°. Мало Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΎΠ½Π° Π΅Ρ‰Π΅ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.

РСализация GIL

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ сигнала ΠΈ запуском ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ довольно сущСствСнной, это зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. А ΠΎΠ½Π° ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ выполнСния. ΠŸΡ€ΠΈ этом Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΈΠΌΠ΅ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Ρ‡Π΅ΠΌ CPU-зависимыС. Если сигнал посылаСтся ΠΏΠΎΡ‚ΠΎΠΊΡƒ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Π° процСссор занят Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, Ρ‚ΠΎ этот ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ довольно Π΄ΠΎΠ»Π³ΠΎ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ сигналов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ посылаСт ΠΏΠΎΡ‚ΠΎΠΊ GIL, становится слишком ΠΌΠ½ΠΎΠ³ΠΎ.
ΠšΠ°ΠΆΠ΄Ρ‹Π΅ 100 Ρ‚ΠΈΠΊΠΎΠ² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, посылаСт сигнал Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ сСмафор процСссу, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всё врСмя этого ΠΆΠ΄Π΅Ρ‚.

Π˜Π·ΠΌΠ΅Ρ€ΠΈΠΌ количСство систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².
Для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния: 736 (Unix), 117 (Mac).
Для Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: 1149 (Unix), 3,3 ΠΌΠ»Π½. (Mac).
Для Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° Π΄Π²ΡƒΡ…ΡŠΡΠ΄Π΅Ρ€Π½ΠΎΠΉ систСмС: 1149 (Unix), 9,5 ΠΌΠ»Π½. (Mac).

На многоядСрной систСмС CPU-зависимыС процСссы ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ядрах), Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ происходит Π±ΠΎΡ€ΡŒΠ±Π° Π·Π° GIL:

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

ΠžΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сотни Π±Π΅Π·ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ GIL.
ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ происходит Π±ΠΈΡ‚Π²Π° Π·Π° Π΄Π²Π΅ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Ρ†Π΅Π»ΠΈ. Python просто Ρ…ΠΎΡ‡Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π΅ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚. А опСрационная систСма («Ооо, ΠΌΠ½ΠΎΠ³ΠΎ ядСр!Β») Ρ‰Π΅Π΄Ρ€ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π²Ρ‹Π³ΠΎΠ΄Ρƒ ΠΈΠ· всСх ядСр.

Π”Π°ΠΆΠ΅ ΠΎΠ΄ΠΈΠ½ CPU-зависимый ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ β€” ΠΎΠ½ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° I/O-зависимого ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ участки ΠΊΠΎΠ΄Π° Π² python ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· gil

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” причудливая Ρ„ΠΎΡ€ΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ смСны ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². CPU-зависимый процСсс (с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ) Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ I/O-зависимого (с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ). Π­Ρ‚ΠΎ происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° многоядСрных процСссорах, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ I/O-ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ достаточно быстро ΠΈ Π·Π°ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ GIL Ρ€Π°Π½ΡŒΡˆΠ΅ CPU-зависимого.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

РСализация GIL Π² Python Π·Π° послСдниС 10 Π»Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ измСнилась. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² Python 1.5.2 выглядит практичСски Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² Python 3.0. Π― Π½Π΅ знаю, Π±Ρ‹Π»ΠΎ Π»ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ GIL достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΎ (особСнно Π½Π° многоядСрных процСссорах). ПолСзнСС ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ GIL Π²ΠΎΠΎΠ±Ρ‰Π΅, Ρ‡Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ. МнС каТСтся, этот ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ дальнСйшСго изучСния. Если GIL остаСтся с Π½Π°ΠΌΠΈ, стоит ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Как ΠΆΠ΅ всё-Ρ‚Π°ΠΊΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹? Π£ мСня Π΅ΡΡ‚ΡŒ нСсколько смутных ΠΈΠ΄Π΅ΠΉ, Π½ΠΎ всС ΠΎΠ½ΠΈ «слоТныС». НуТно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Python появился свой собствСнный диспСтчСр ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (ΠΈΠ»ΠΈ хотя Π±Ρ‹ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ взаимодСйствовия с диспСтчСром ОБ). Но это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ ОБ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ, Ρ‡Ρ‚ΠΎ самоС ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ΅, модулями C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ.

Π‘Ρ‚ΠΎΠΈΡ‚ Π»ΠΈ ΠΎΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ? Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ повСдСния GIL сдСлало Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π΄Π°ΠΆΠ΅ с GIL) Π±ΠΎΠ»Π΅Π΅ прСдсказуСмым ΠΈ ΠΌΠ΅Π½Π΅Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊ рСсурсам. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡΡ врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. НадСюсь, ΠΏΡ€ΠΈ этом удастся ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ пСрСписывания ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.

ПослСсловиС ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π» Π±Ρ‹Π» ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ ΠΊΠ°ΠΊ прСзСнтация, поэтому ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок повСствования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ‚Π°Ρ‚ΡŒΡŽ Π±Ρ‹Π»ΠΎ Π»Π΅Π³Ρ‡Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ. Π’Π°ΠΊΠΆΠ΅ я ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠ» трассировки Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° β€” Ссли Π²Π°ΠΌ интСрСсно, посмотритС Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅.

Π₯Π°Π±Ρ€Π°Π»ΡŽΠ΄ΠΈ, посовСтуйтС интСрСсныС английскиС ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ пСрСвСсти. Π£ мСня Π΅ΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Π΅ ΠΏΠ°Ρ€Π° статСй, Π½ΠΎ хочСтся Π΅Ρ‰Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *