ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния

Учимся ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΈ многопроцСссныС прилоТСния Π½Π° Python

ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСнияЭта ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π΅ для ΠΌΠ°Ρ‚Ρ‘Ρ€Ρ‹Ρ… ΡƒΠΊΡ€ΠΎΡ‚ΠΈΡ‚Π΅Π»Π΅ΠΉ Python’а, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°ΡΠΏΡƒΡ‚Π°Ρ‚ΡŒ этот ΠΊΠ»ΡƒΠ±ΠΎΠΊ Π·ΠΌΠ΅ΠΉ β€” дСтская Π·Π°Π±Π°Π²Π°, Π° скорСС повСрхностный ΠΎΠ±Π·ΠΎΡ€ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… возмоТностСй для Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΏΠΎΠ΄ΡΠ΅Π²ΡˆΠΈΡ… Π½Π° ΠΏΠΈΡ‚ΠΎΠ½.

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

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

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния

Π’ Python Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ threading, ΠΈ Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ программирования: Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° Π»ΠΎΠΊΠΈ, ΠΈ сСмафор, ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ событий. Один словом β€” всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ всСм этим инструмСнтариСм достаточно просто. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая запускаСт 2 ΠΏΠΎΡ‚ΠΎΠΊΠ°. Один ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ Π΄Π΅ΡΡΡ‚ΡŒ β€œ0”, Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π΄Π΅ΡΡΡ‚ΡŒ β€œ1”, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ строго ΠΏΠΎ-ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

Никакой ΠΌΠ°Π³ΠΈΠΈ ΠΈ voodoo-ΠΊΠΎΠ΄Π°. Код Ρ‡Π΅Ρ‚ΠΊΠΈΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΌΡ‹ создали ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π΅Ρ‰Π΅ ΠΈ достаточно Π³ΠΈΠ±ΠΊΠΈΠΉ. Допустим Ρƒ нас появился 3-ΠΉ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ β€œ2”, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ΠœΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½ΠΎΠ²ΠΎΠ΅ событиС, Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ слСгка ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ
ΡΡ‚Π°Ρ€Ρ‚ΡƒΡŽΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ (ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с использованиСм, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, MapReduce, Π½ΠΎ это ΡƒΠΆΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ).
Как Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ°Π³ΠΈΠΈ. ВсС просто ΠΈ понятно. ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ дальшС.

Global Interpreter Lock

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ самыС распространСнныС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, для увСличСния эффСктивности использования многоядСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ cΠΎΠ²Ρ€ΠΌΠ΅Π½Π½Ρ‹Ρ… процСссоров, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;
Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ»ΠΈ частично асинхронныС сСкции (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΈΠ½Π³ΠΎΠ²Π°Ρ‚ΡŒ нСсколько сСрвСров ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ).

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΌΡ‹ сталкиваСмся с Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Python (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ основной Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CPython), ΠΊΠ°ΠΊ Global Interpreter Lock (ΠΈΠ»ΠΈ сокращСнно GIL). ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ GIL Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ процСссором. Π­Ρ‚ΠΎ сдСлано для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π½Π΅ Π±Ρ‹Π»ΠΎ Π±ΠΎΡ€ΡŒΠ±Ρ‹ Π·Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π˜ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΏΠΎ всСму ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ. Вакая ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Python Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ Π΄Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ (thread safety).

Но Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ½ΠΊΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, сколько ΠΈ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅, Π΄Π΅Π»Π°ΡŽΡ‰Π΅Π΅ Ρ‚ΠΎ ΠΆΠ΅ самоС, ΠΈΠ»ΠΈ Π·Π° сумму Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° CPU. Но Ρ‚ΡƒΡ‚ нас ΠΏΠΎΠ΄ΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ нСприятный эффСкт. Рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° просто ΠΏΠΈΡˆΠ΅Ρ‚ Π² Ρ„Π°ΠΉΠ» ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ строк β€œ1” ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ это Π·Π°

0.35 сСкунды Π½Π° ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.

Рассмотрим Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт 2 ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΎΠ½Π° ΠΏΠΈΡˆΠ΅Ρ‚ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»ΠΈΠΊ ΠΏΠΎ ΠΏΠΎΠ» ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° строк β€œ1”. По-сути объСм Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. А Π²ΠΎΡ‚ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚ΡƒΡ‚ получаСтся интСрСсный эффСкт. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚ 0.7 сСкунды Π΄ΠΎ Π°ΠΆ 7 сСкунд. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ Ρ‚Π°ΠΊ происходит?

Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ нуТдаСтся Π² рСсурсС CPU β€” ΠΎΠ½ освобоТдаСт GIL, Π° Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ½ сам, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ Π΅Ρ‰Π΅ ΠΈ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. ΠŸΡ€ΠΈ этом опСрационная систСма, зная, Ρ‡Ρ‚ΠΎ ядСр ΠΌΠ½ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡƒΠ³ΡƒΠ±ΠΈΡ‚ΡŒ всС ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ядрами.

UPD: Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² Python 3.2 сущСствуСт ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ рСализация GIL, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° частично Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ, Π² частности, Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ послС ΠΏΠΎΡ‚Π΅Ρ€ΠΈ управлСния ΠΆΠ΄Π΅Ρ‚ нСбольшой ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ смоТСт ΠΎΠΏΡΡ‚ΡŒ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ GIL (Π½Π° эту Ρ‚Π΅ΠΌΡƒ Π΅ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ прСзСнтация Π½Π° английском)

Β«Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Python нСльзя ΠΏΠΈΡΠ°Ρ‚ΡŒ эффСктивныС ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹?Β», β€” спроситС Π²Ρ‹. НСт, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹Ρ…ΠΎΠ΄ Π΅ΡΡ‚ΡŒ ΠΈ Π΄Π°ΠΆΠ΅ нСсколько.

ΠœΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠ½Ρ‹Π΅ прилоТСния

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅, Π² Python Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ subprocess. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ (Π½Π° самом Π΄Π΅Π»Π΅ ΡƒΠΆΠ΅ процСссС). И Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΅Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π’Π°ΠΊΠΎΠΉ способ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускорил Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρƒ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, созданныС Π² Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ GIL Π½Π΅ Π·Π°Π±ΠΈΡ€Π°ΡŽΡ‚, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΄ΡƒΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ процСсса. Однако, Π² этом способС Π΅ΡΡ‚ΡŒ масса ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами становится Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π°Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ связь Ρ‡Π΅Ρ€Π΅Π· PIPE ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³Π΅ инструмСнты, Π° вСдь всС это нСсСт Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы ΠΈ ΠΊΠΎΠ΄ становится слоТным для понимания.

Π—Π΄Π΅ΡΡŒ Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’ Python Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ multiprocessing. По Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ threading. НапримСр, процСссы ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с процСссами ΠΏΠΎΡ‡Ρ‚ΠΈ всС Ρ‚Π΅ ΠΆΠ΅ самыС, Ρ‡Ρ‚ΠΎ ΠΈ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ· модуля threading. А Π²ΠΎΡ‚ для синхронизации процСссов ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ принято ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты. Π Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎΠ± очСрСдях (Queue) ΠΈ ΠΊΠ°Π½Π°Π»Π°Ρ… (Pipe). Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π°Π½Π°Π»ΠΎΠ³ΠΈ Π»ΠΎΠΊΠΎΠ², событий ΠΈ сСмафоров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π² threading, здСсь Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ multiprocessing Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Для этого Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π΅ΡΡ‚ΡŒ классы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Value) ΠΈ массива (Array), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ β€œΠΎΠ±ΠΎΠ±Ρ‰Π°Ρ‚ΡŒβ€ (share) ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами. Для удобства Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ классы-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ (Manager). Они Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π² ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅. НСльзя Π½Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· модуля ctypes с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля multiprocessing.sharedctypes.

Π•Ρ‰Π΅ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ multiprocessing Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ создания ΠΏΡƒΠ»ΠΎΠ² процСссов. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблона Master-Worker ΠΈΠ»ΠΈ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Map (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС являСтся частным случаСм Master-Worker).

Из основных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ multiprocessing стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ этого модуля. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ОБ Ρ€Π°Π±ΠΎΡ‚Π° с процСссами ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ, Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния. НапримСр, Π² ОБ Windows Π½Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° fork, поэтому Ρ‚ΠΎΡ‡ΠΊΡƒ раздСлСния процСссов Π½Π°Π΄ΠΎ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π²:

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, эта конструкция ΠΈ Ρ‚Π°ΠΊ являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Ρ‚ΠΎΠ½ΠΎΠΌ.

Для написания ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Hadoop+Python ΠΈΠ»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MPI Π½Π° Python (pyMPI, mpi4py). МоТно Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π° Π‘++ ΠΈΠ»ΠΈ Fortran. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΡ„ΠΎΡ€ΠΊΠΈ/Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠ°ΠΊ Pyro, Twisted, Tornado ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Но это всС ΡƒΠΆΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Если ΠΌΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ Π²Π°ΠΌ понравился, Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ простыС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π° PLY ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ.

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

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния Π² C# для Ρ‡Π°ΠΉΠ½ΠΈΠΊΠΎΠ²

ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСнияЧто Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния? Π“Ρ€ΡƒΠ±ΠΎ говоря, это прилоТСния с нСсколькими Β«Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Π—Π°Ρ‡Π΅ΠΌ это Π½ΡƒΠΆΠ½ΠΎ? РСсурсы ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅ всСгда эффСктивно. НапримСр, ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° скачиваСт страницу ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°, ΠΏΠΎΡ‚ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΅, Π·Π°Ρ‚Π΅ΠΌ β€” ΠΊΠ°Ρ‡Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ. Π’ΠΎ врСмя Π°Π½Π°Π»ΠΈΠ·Π° простаиваСт ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ соСдинСниС, Π° Π²ΠΎ врСмя Π·Π°ΠΊΠ°Ρ‡ΠΊΠΈ β€” скучаСт процСссор. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. Π£ΠΆΠ΅ Π²ΠΎ врСмя Π°Π½Π°Π»ΠΈΠ·Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ страницы ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ.

Π― ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΠ°Ρ€Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² с ΠΊΠΎΠ΄ΠΎΠΌ. ΠŸΡ€ΠΎΡˆΡƒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

Для Π½Π°Ρ‡Π°Π»Π°, Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. НапримСр, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…. Π•Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ порядкС ΠΈ Π±Π΅Π· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСльзя. Π’ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹? Мой ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹ΠΌ систСмам ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ 2 Ρ€Π°Π±ΠΎΡ‡ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΊΠΎΠΏΠ°ΡŽΡ‚ ямы. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹ΠΊΠΎΠΏΠ°Π΅Ρ‚ яму Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ 2 ΠΌΠ΅Ρ‚Ρ€Π°, Π·Π° 1 час. Π’ΠΎΠ³Π΄Π° Π΄Π²Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ…, Π²Ρ‹ΠΊΠΎΠΏΠ°ΡŽΡ‚ эту яму Π·Π° полчаса. Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΏΡ€Π°Π²Π΄Ρƒ. Π”Π°Π²Π°ΠΉΡ‚Π΅ возьмСм 3600 Ρ‚Π°ΠΊΠΈΡ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ…. ВСорСтичСски, ΠΎΠ½ΠΈ Π²Ρ‹ΠΊΠΎΠΏΠ°ΡŽΡ‚ яму Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ 2 ΠΌΠ΅Ρ‚Ρ€Π° Π·Π° 1 сСкунду. Но Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ, Ρ‚ΠΎΠΏΡ‚Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ мСстС ΠΈ Π½Π΅Ρ€Π²Π½ΠΈΡ‡Π°Ρ‚ΡŒ.

Π― надСюсь, Π²Ρ‹ поняли, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½ΡƒΠΆΠ½Π° Π½Π΅ всСгда, ΠΈ Ρ‡Ρ‚ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Β«Ρ‡Π΅ΠΌ большС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² β€” Ρ‚Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅Β» ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ. ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эффСктивно рСсурсы систСмы, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚.

Π”Π°Π»Π΅Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ. Π§Ρ‚ΠΎ Π±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ пространство ΠΈΠΌΠ΅Π½ System.Threading, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² Π½Π°Ρ‡Π°Π»ΠΎ Ρ„Π°ΠΉΠ»Π° с ΠΊΠΎΠ΄ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ:

Π›ΡŽΠ±ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² C# это функция. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сами ΠΏΠΎ сСбС, ΠΎΠ½ΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π°ΠΌ понадобится класс с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Π‘Π°ΠΌΡ‹ΠΉ простой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ void ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запуска Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°:

ПослС Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Start() Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вСрнСтся сразу, Π½ΠΎ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΡƒΠΆΠ΅ Π½Π°Ρ‡Π½Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ваш Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Новый ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MyThreadFunction ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. Мой Π΄Ρ€ΡƒΠ³ спросил мСня, Π° ΠΏΠΎΡ‡Π΅ΠΌΡƒ функция Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅? А ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π΅ΠΊΡƒΠ΄Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ. ПослС Π²Ρ‹Π·ΠΎΠ²Π° Start(), ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся дальшС, ΠΏΡ€ΠΈ этом созданный ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя. Π§Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ класса. Об этом ΠΏΠΎΠ·ΠΆΠ΅.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, сущСствуСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ. Выглядит ΠΎΠ½ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π•Π³ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈ создании ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅. Π›ΡŽΠ±ΠΎΠΉ класс Π² C# наслСдуСтся ΠΎΡ‚ Object, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ° любой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΠΎΠ·ΠΆΠ΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅. Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запустит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π° Π½Π° экран Β«Π­Ρ‚ΠΎ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹!Β», Π² это врСмя созданный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π° Π½Π° экран Β«Π­Ρ‚ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹!Β». Π’ΠΎΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

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

ИдСм дальшС. Π§Ρ‚ΠΎ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ссли ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, для создания 10 ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π°ΠΌ понадобилась всСго 1 функция.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ свой стСк, поэтому Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° свои. Π§Ρ‚ΠΎ Π±Ρ‹ это ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΌΡ‹ создадим ΠΏΠΎΡ‚ΠΎΠΊ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° класса, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ этот ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ· Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ΠΎΡ‚ ΠΊΠΎΠ΄:

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π² консолС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ 10 чисСл.

Если ΠΆΠ΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π²Π΅Π» сСбя ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ β€” созданиС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΠΎΡ‚ΠΎΠΊΠ°. НапримСр, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎΠ΅. Бмысл Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ дСйствия Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. Для этого, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Β«ΠΊΡ‚ΠΎ я?Β». Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния. Π’ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΡƒΠ»Π΅Π²Ρ‹ΠΉ Ρ„Π»Π°Π³. Если ΠΎΠ½ Ρ€Π°Π²Π΅Π½ истинС β€” Π·Π½Π°Ρ‡ΠΈΡ‚ это ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Ссли лоТь β€” Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ. ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΡ‚ΠΎΠΊΠ° сам Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Β«ΠΊΡ‚ΠΎ я?Β» ΠΈ Π² зависимости ΠΎΡ‚ этого, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ дСйствия. Π’ΠΎΡ‚ ΠΊΠΎΠ΄:

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°? ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свой экзСмпляр ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Если ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π²Ρ‹Π΄Π°Π»ΠΈ Ρ„Π»Π°Π³ true, Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΎΠ½ выполняСт ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ΄, Ссли false β€” Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ ΠΆΠ΅ наглядно дСмонстрируСт ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ я ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΊΠΎΠ΄ΠΎΠΌ, расскаТу Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ. Π’ΠΎ всСх ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… прилоТСниях сущСствуСт синхронизация Π΄Π°Π½Π½Ρ‹Ρ…. Когда Π΄Π²Π° ΠΈΠ»ΠΈ большС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠ°ΠΊΠΈΠΌΠΈ Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ β€” ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ошибка. Для этого Π² C# сущСствуСт нСсколько способов синхронизации, Π½ΠΎ ΠΌΡ‹ рассмотрим самый простой с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° lock.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (свойство класса). Для обСспСчСния сохранности Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lock. Π•Π³ΠΎ синтаксис ΠΎΡ‡Π΅Π½ΡŒ простой:

Как ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? Когда ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° lock, ΠΎΠ½ провСряСт, Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π»ΠΈ object1. Если Π½Π΅Ρ‚ β€” выполняСт ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² скобках ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. Если Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ β€” ΠΆΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° object1 Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lock ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌ.

А Π²ΠΎΡ‚ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

Π― использовал ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° lock, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ int ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. А Π²ΠΎΠΎΠ±Ρ‰Π΅, ΠΌΠ½Π΅ ΠΊΠ°ΠΊ Ρ‚ΠΎ Π½Π° Ρ…Π°Π±Ρ€Π΅ посовСтовали всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Β«Π»ΠΎΠΊΠ΅Ρ€Ρ‹Β» для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ….

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ сначала Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства value, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π—Π°Ρ‡Π΅ΠΌ ΠΆΠ΅ Ρ‚ΡƒΡ‚ Π½ΡƒΠΆΠ΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lock? ЗапуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Она Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΏΠΎ порядку Β«0 1 2 3 4Β». ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ выводят Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ value, ΠΈ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° lock Π½Π΅Ρ‚Ρƒ. Π’ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

… ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Β«0 0 1 3 4Β». Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ процСссор ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π·Π°Π΄Π°Ρ‡ Π½Π΅ Π·Π½Π°ΡŽΡ‚ Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, поэтому ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ это ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΈ этом Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ.

Π”ΡƒΠΌΠ°ΡŽ, Π½Π° сСгодня Ρ…Π²Π°Ρ‚ΠΈΡ‚, ΠΈ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ здСсь. ΠŸΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΎΡ‚Π·Ρ‹Π²Ρ‹ ΠΈ поТСлания. Π—Π°Π΄Π°Π²Π°ΠΉΡ‚Π΅ свои ΠΎΡ‚Π²Π΅Ρ‚Ρ‹. Π£Π΄Π°Ρ‡Π½ΠΎΠΉ компиляции.

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

Учимся ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΈ многопроцСссныС прилоТСния Π½Π° Python

ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСнияЭта ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π΅ для ΠΌΠ°Ρ‚Ρ‘Ρ€Ρ‹Ρ… ΡƒΠΊΡ€ΠΎΡ‚ΠΈΡ‚Π΅Π»Π΅ΠΉ Python’а, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°ΡΠΏΡƒΡ‚Π°Ρ‚ΡŒ этот ΠΊΠ»ΡƒΠ±ΠΎΠΊ Π·ΠΌΠ΅ΠΉ β€” дСтская Π·Π°Π±Π°Π²Π°, Π° скорСС повСрхностный ΠΎΠ±Π·ΠΎΡ€ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… возмоТностСй для Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΏΠΎΠ΄ΡΠ΅Π²ΡˆΠΈΡ… Π½Π° ΠΏΠΈΡ‚ΠΎΠ½.

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

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

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния

Π’ Python Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ threading, ΠΈ Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ программирования: Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° Π»ΠΎΠΊΠΈ, ΠΈ сСмафор, ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ событий. Один словом β€” всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ всСм этим инструмСнтариСм достаточно просто. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая запускаСт 2 ΠΏΠΎΡ‚ΠΎΠΊΠ°. Один ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ Π΄Π΅ΡΡΡ‚ΡŒ β€œ0”, Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π΄Π΅ΡΡΡ‚ΡŒ β€œ1”, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ строго ΠΏΠΎ-ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

Никакой ΠΌΠ°Π³ΠΈΠΈ ΠΈ voodoo-ΠΊΠΎΠ΄Π°. Код Ρ‡Π΅Ρ‚ΠΊΠΈΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΌΡ‹ создали ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π΅Ρ‰Π΅ ΠΈ достаточно Π³ΠΈΠ±ΠΊΠΈΠΉ. Допустим Ρƒ нас появился 3-ΠΉ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ β€œ2”, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ΠœΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½ΠΎΠ²ΠΎΠ΅ событиС, Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ слСгка ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ
ΡΡ‚Π°Ρ€Ρ‚ΡƒΡŽΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ (ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с использованиСм, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, MapReduce, Π½ΠΎ это ΡƒΠΆΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ).
Как Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ°Π³ΠΈΠΈ. ВсС просто ΠΈ понятно. ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ дальшС.

Global Interpreter Lock

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ самыС распространСнныС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, для увСличСния эффСктивности использования многоядСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ cΠΎΠ²Ρ€ΠΌΠ΅Π½Π½Ρ‹Ρ… процСссоров, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;
Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ»ΠΈ частично асинхронныС сСкции (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΈΠ½Π³ΠΎΠ²Π°Ρ‚ΡŒ нСсколько сСрвСров ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ).

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΌΡ‹ сталкиваСмся с Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Python (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ основной Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CPython), ΠΊΠ°ΠΊ Global Interpreter Lock (ΠΈΠ»ΠΈ сокращСнно GIL). ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ GIL Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ процСссором. Π­Ρ‚ΠΎ сдСлано для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π½Π΅ Π±Ρ‹Π»ΠΎ Π±ΠΎΡ€ΡŒΠ±Ρ‹ Π·Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π˜ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΏΠΎ всСму ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ. Вакая ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Python Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ Π΄Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ (thread safety).

Но Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ½ΠΊΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, сколько ΠΈ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅, Π΄Π΅Π»Π°ΡŽΡ‰Π΅Π΅ Ρ‚ΠΎ ΠΆΠ΅ самоС, ΠΈΠ»ΠΈ Π·Π° сумму Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° CPU. Но Ρ‚ΡƒΡ‚ нас ΠΏΠΎΠ΄ΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ нСприятный эффСкт. Рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° просто ΠΏΠΈΡˆΠ΅Ρ‚ Π² Ρ„Π°ΠΉΠ» ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ строк β€œ1” ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ это Π·Π°

0.35 сСкунды Π½Π° ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.

Рассмотрим Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт 2 ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΎΠ½Π° ΠΏΠΈΡˆΠ΅Ρ‚ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»ΠΈΠΊ ΠΏΠΎ ΠΏΠΎΠ» ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° строк β€œ1”. По-сути объСм Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. А Π²ΠΎΡ‚ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚ΡƒΡ‚ получаСтся интСрСсный эффСкт. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚ 0.7 сСкунды Π΄ΠΎ Π°ΠΆ 7 сСкунд. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ Ρ‚Π°ΠΊ происходит?

Π­Ρ‚ΠΎ происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ нуТдаСтся Π² рСсурсС CPU β€” ΠΎΠ½ освобоТдаСт GIL, Π° Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ½ сам, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ Π΅Ρ‰Π΅ ΠΈ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. ΠŸΡ€ΠΈ этом опСрационная систСма, зная, Ρ‡Ρ‚ΠΎ ядСр ΠΌΠ½ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡƒΠ³ΡƒΠ±ΠΈΡ‚ΡŒ всС ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ядрами.

UPD: Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² Python 3.2 сущСствуСт ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ рСализация GIL, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° частично Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ, Π² частности, Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ послС ΠΏΠΎΡ‚Π΅Ρ€ΠΈ управлСния ΠΆΠ΄Π΅Ρ‚ нСбольшой ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ смоТСт ΠΎΠΏΡΡ‚ΡŒ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ GIL (Π½Π° эту Ρ‚Π΅ΠΌΡƒ Π΅ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ прСзСнтация Π½Π° английском)

Β«Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Python нСльзя ΠΏΠΈΡΠ°Ρ‚ΡŒ эффСктивныС ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹?Β», β€” спроситС Π²Ρ‹. НСт, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹Ρ…ΠΎΠ΄ Π΅ΡΡ‚ΡŒ ΠΈ Π΄Π°ΠΆΠ΅ нСсколько.

ΠœΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠ½Ρ‹Π΅ прилоТСния

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅, Π² Python Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ subprocess. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ (Π½Π° самом Π΄Π΅Π»Π΅ ΡƒΠΆΠ΅ процСссС). И Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΅Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π’Π°ΠΊΠΎΠΉ способ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускорил Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρƒ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, созданныС Π² Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ GIL Π½Π΅ Π·Π°Π±ΠΈΡ€Π°ΡŽΡ‚, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΄ΡƒΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ процСсса. Однако, Π² этом способС Π΅ΡΡ‚ΡŒ масса ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами становится Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π°Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ связь Ρ‡Π΅Ρ€Π΅Π· PIPE ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³Π΅ инструмСнты, Π° вСдь всС это нСсСт Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы ΠΈ ΠΊΠΎΠ΄ становится слоТным для понимания.

Π—Π΄Π΅ΡΡŒ Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’ Python Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ multiprocessing. По Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ threading. НапримСр, процСссы ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с процСссами ΠΏΠΎΡ‡Ρ‚ΠΈ всС Ρ‚Π΅ ΠΆΠ΅ самыС, Ρ‡Ρ‚ΠΎ ΠΈ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ· модуля threading. А Π²ΠΎΡ‚ для синхронизации процСссов ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ принято ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты. Π Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎΠ± очСрСдях (Queue) ΠΈ ΠΊΠ°Π½Π°Π»Π°Ρ… (Pipe). Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π°Π½Π°Π»ΠΎΠ³ΠΈ Π»ΠΎΠΊΠΎΠ², событий ΠΈ сСмафоров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π² threading, здСсь Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ multiprocessing Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Для этого Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π΅ΡΡ‚ΡŒ классы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Value) ΠΈ массива (Array), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ β€œΠΎΠ±ΠΎΠ±Ρ‰Π°Ρ‚ΡŒβ€ (share) ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами. Для удобства Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ классы-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ (Manager). Они Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π² ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅. НСльзя Π½Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· модуля ctypes с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля multiprocessing.sharedctypes.

Π•Ρ‰Π΅ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ multiprocessing Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ создания ΠΏΡƒΠ»ΠΎΠ² процСссов. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблона Master-Worker ΠΈΠ»ΠΈ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Map (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС являСтся частным случаСм Master-Worker).

Из основных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ multiprocessing стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ этого модуля. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ОБ Ρ€Π°Π±ΠΎΡ‚Π° с процСссами ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ, Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния. НапримСр, Π² ОБ Windows Π½Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° fork, поэтому Ρ‚ΠΎΡ‡ΠΊΡƒ раздСлСния процСссов Π½Π°Π΄ΠΎ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π²:

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, эта конструкция ΠΈ Ρ‚Π°ΠΊ являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Ρ‚ΠΎΠ½ΠΎΠΌ.

Для написания ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Hadoop+Python ΠΈΠ»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MPI Π½Π° Python (pyMPI, mpi4py). МоТно Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π° Π‘++ ΠΈΠ»ΠΈ Fortran. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΡ„ΠΎΡ€ΠΊΠΈ/Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠ°ΠΊ Pyro, Twisted, Tornado ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Но это всС ΡƒΠΆΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Если ΠΌΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ Π²Π°ΠΌ понравился, Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ простыС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π° PLY ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ.

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

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Python Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…: ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ настройки прилоТСния

ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния

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

Если эта ΡΡ‚Π°Ρ‚ΡŒΡ всСм понравится, Π·Π° Π½Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ сСрия Π½Π° Ρ‚Ρƒ ΠΆΠ΅ Ρ‚Π΅ΠΌΡƒ: ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° Python. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ взяты ΠΈΠ· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Polog, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΏΠΈΡˆΡƒ Π² свободноС врСмя. Он ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для логирования, Π½ΠΎ я постарался вынСсти всС Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ Π² эту ΡΡ‚Π°Ρ‚ΡŒΡŽ Π² спСцифико-агностичной Ρ„ΠΎΡ€ΠΌΠ΅. А Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π±Π΅Π· спСцифики Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ, Π±ΡƒΠ΄Ρƒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π² Ρ‡Ρ‘ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½Π° состоит. Π₯очСтся Π²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π΄Π°ΠΆΠ΅ поспособствуСт ΡƒΡΠ²ΠΎΠ΅Π½ΠΈΡŽ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π·Π° счёт ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ ассоциативных связСй, Ρ‡Ρ‚ΠΎ Π»ΠΈ.

ДисклСймСр

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ собствСнный ΠΊΠΎΠ΄ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, я Ρ‚Π΅ΠΌ самым Π½Π΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ написан Π»ΡƒΡ‡ΡˆΠΈΠΌ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ способов. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, я Π΄Π°ΠΆΠ΅ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ смоТСтС Π½Π°ΠΉΡ‚ΠΈ Π² Π½Ρ‘ΠΌ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ…) нСдостатков. Если Π²Π΄Ρ€ΡƒΠ³ Π²Ρ‹ Π² состоянии это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΊΡ€ΡƒΡ‚ΠΎ, Π½Π΅ сдСрТивайтС сСбя.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, здСсь Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈΠΊΠ±Π΅Π·Π° ΠΏΡ€ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ threading ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΈ Π² Ρ†Π΅Π»ΠΎΠΌ хотя Π±Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Ρ‚Π΅ΠΌΠΎΠΉ. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ вашСй Π±Π°Π±ΡƒΡˆΠΊΠΈ, ΠΊΡ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ эти наши Π»ΠΎΠΊΠΈ (ΠΈ ΠΊΠ°ΠΊΠΎΠ²Ρ‹ ΠΈΡ… сСмСйныС Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ с Π΄Π΅Π΄ΠΎΠΌ), Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ состояниС Π³ΠΎΠ½ΠΊΠΈ ΠΈ всякоС ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅. ΠŸΡ€ΠΎ это всё Π²Ρ‹ ΡƒΠΆΠ΅ сами ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π°ΠΌ интСрСсно Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, сколько Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π΅Ρ‘ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

Π§Π΅Π³ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ?

ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния

БущСствуСт самый простой ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ способ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ настройки прилоТСния Π² качСствС ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля ΠΈΠ»ΠΈ класса. Π•Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π² Ρ‚ΠΎΠΌ числС ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ, ΠΈ я ΠΏΠΎΠ½Π°Ρ‡Π°Π»Ρƒ Π΄Π΅Π»Π°Π» Ρ‚Π°ΠΊ ΠΆΠ΅. Π’Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Ρƒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ всё ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ настроСк Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ довольно спСцифичСскиС трСбования:

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° гибкая валидация Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с описаниСм Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ сдСлал Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠΎΠ³Π΄Π° попытался ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ настройку (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹).

НСобходимо Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ просто значСния сами ΠΏΠΎ сСбС, Π½ΠΎ ΠΈ ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Polog поддСрТиваСтся Π΄Π²Π° Ρ‚ΠΈΠΏΠ° Π΄Π²ΠΈΠΆΠΊΠΎΠ²: синхронный (Π±Π΅Π· использования Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ² Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…) ΠΈ асинхронный. Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹ΠΉ подгруТаСтся, ΠΊΠΎΠ³Π΄Π° настройка pool_size установлСна Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, асинхронный β€” ΠΏΡ€ΠΈ любом Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ большС нуля. Асинхронный Π΄Π²ΠΈΠΆΠΎΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ схСмС producer–consumer с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π’Π°ΠΊ Π²ΠΎΡ‚, для этой самой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π»ΠΈΠΌΠΈΡ‚ β€” Ρ†Π΅Π»ΠΎΠ΅ число большС нуля, Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ, оставив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. «НСвозмоТной» ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ являСтся pool_size Ρ€Π°Π²Π½Ρ‹ΠΉ нолю, ΠΈ ΠΏΡ€ΠΈ этом max_queue_size (Π»ΠΈΠΌΠΈΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ) большС нуля, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π² синхронном Π΄Π²ΠΈΠΆΠΊΠ΅ просто Π½Π΅Ρ‚. Π₯отя ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° ΠΈ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ β€” само ΠΏΠΎ сСбС Π²Π°Π»ΠΈΠ΄Π½ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с описаниСм ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ.

НуТна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ настройки Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π˜ΡΡ…ΠΎΠ΄Π½ΠΎ всё Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Ρ‚Π°ΠΊ: ΠΏΠ΅Ρ€Π΅Π΄ записью самого ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π»ΠΎΠ³Π° Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ значСния для всСх ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² настроСк, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π»ΠΎΠ³ создавался, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ всС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° согласно настройкам Π½Π° этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π”Π°Π»ΡŒΡˆΠ΅ ΡƒΠΆΠ΅ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π±Ρ‹Π»ΠΎ нСльзя. Π’Π°ΠΊ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ, Π² ΠΈΠ΄Π΅Π°Π»Π΅ любой ΠΏΡƒΠ½ΠΊΡ‚ настроСк Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ потСряв ΠΏΡ€ΠΈ этом Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ записи. Π”Π°Π»ΡŒΡˆΠ΅ станСт ясно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ этого Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ просто.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ настроСк Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Всё Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ΠΎ ΠΎΡ‚ состояния Π³ΠΎΠ½ΠΊΠΈ.

Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ интСрфСйс словаря. Π­Ρ‚ΠΎ просто ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π° Π΅Ρ‰Ρ‘ Ρ‚Π°ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° ΠΏΡ€ΠΎΡ‰Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, подмСняя Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ настроСк словарСм.

Базовая концСпция

Π£ нас Π΅ΡΡ‚ΡŒ класс, ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ доступ ΠΊ ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ:

ΠšΠ»ΡŽΡ‡ΠΈ Π² этом словарС β€” ΠΈΠΌΠ΅Π½Π° ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² настроСк, Π° значСния β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… хранятся значСния. ИмСнно Π² этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… класса SettingPoint ΠΈ происходит ΠΏΠΎΡ‡Ρ‚ΠΈ вся описанная Π²Ρ‹ΡˆΠ΅ магия: валидация Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΊΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ красивых ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ всё ΠΏΡ€ΠΎΡ‡Π΅Π΅. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ сосрСдоточимся Π½Π° устройствС ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ этого класса.

Π’Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ значСния

РассмотрСниС класса SettingPoint ΠΌΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ с самого простого β€” ΠΊΠ°ΠΊ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΡŽΡ‚ΡΡ значСния. Напомню, Ρ‡Ρ‚ΠΎ созданиС экзСмпляра выглядСло ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

На этом этапС нас интСрСсуСт ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ экзСмпляра ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ proves :

Π˜Ρ‰Π΅ΠΌ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹

НСмного услоТняСм Π·Π°Π΄Π°Ρ‡Ρƒ: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… значСния настроСк Π½Π΅ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ, хотя ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΎ. Для этого ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° SettingPoint ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с описаниСм ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ:

ΠšΠ»ΡŽΡ‡ΠΈ Π² этом словарС β€” это названия ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ провСряСм, Π° значСния β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΏΡƒΠ½ΠΊΡ‚Π° настроСк ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π΄ΠΎ этого; ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ поля, ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ. Для этого Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ поля запускаСтся ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄:

Π§Ρ‚ΠΎ ΠΆ, ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Π»ΠΈ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ настройки Π½Π°ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ наша Π·Π°Π΄Π°Ρ‡Π° β€” ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

МСняСм настройки Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅

ΠŸΡƒΠ½ΠΊΡ‚ΠΎΠ² настроСк большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Π½ΠΎ я ΠΎΠΏΠΈΡˆΡƒ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ измСнСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠ²ΠΎΠ·ΠΈΡ‚ΡŒΡΡ большС всСх. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ слоТно Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, придётся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² устройство Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Π΄ΠΎ ΠΈ послС. Π‘ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ спСцифики, Π±Π΅Π· Π½Π΅Ρ‘ Π½ΠΈΠΊΡƒΠ΄Π°.

Π˜ΡΡ…ΠΎΠ΄Π½ΠΎ ядро Polog Π±Ρ‹Π»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ, Π½Π° Π±Π°Π·Π΅ самописного thread pool. Π’Ρ€Π΅Π΄ΠΏΡƒΠ» Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΏΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρƒ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ-подписчик, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ состоял ΠΈΠ· Ρ‚Ρ€`Ρ… логичСских частСй:

ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π»ΠΎΠ³ΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

Набор ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²-Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ². Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… Π·Π°ΠΏΡƒΡ‰Π΅Π½ бСсконСчный Ρ†ΠΈΠΊΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ появлСния Π½ΠΎΠ²Ρ‹Ρ… записСй Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚ Π»ΠΎΠ³, ΠΎΠ½ сразу Π΅Π³ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, записываСт Π² Ρ„Π°ΠΉΠ».

Π’ΠΎΡ€ΠΊΠ΅Ρ€Ρ‹ создавались Β«Π»Π΅Π½ΠΈΠ²ΠΎΒ», Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ записи ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π»ΠΎΠ³Π°. Π­Ρ‚ΠΎ позволяло ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ настройки Π½Π° этапС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π΄ΠΏΡƒΠ» получался Β«ΠΏΡ€ΠΈΠΊΠΎΠ»ΠΎΡ‡Π΅Π½Π½Ρ‹ΠΌ гвоздями». ПослС записи ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π»ΠΎΠ³Π° ΡƒΠΆΠ΅ Π½ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ², Π½ΠΈ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π»ΠΈΡˆΠ½ΠΈΡ…. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ Π±Ρ‹Π»Π° прСдусмотрСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования бСспоточного Π΄Π²ΠΈΠΆΠΊΠ°: класс Π΄Π²ΠΈΠΆΠΊΠ° Ρ‚ΠΎΠΆΠ΅, получаСтся, ΠΏΡ€ΠΈΠΊΠΎΠ»ΠΎΡ‡Π΅Π½. Π’Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Ρ€Π΅Π΄ΠΏΡƒΠ»Π° Π² настройках Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ число Π½Π΅ мСньшС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹.

БущСствуСт Π΄Π²Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ стратСгии измСнСния Ρ‚Ρ€Π΅Π΄ΠΏΡƒΠ»Π° Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ»:

ИзмСнСниС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ‚Ρ€Π΅Π΄ΠΏΡƒΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ добавлСния Π½ΠΎΠ²Ρ‹Ρ… ΠΈΠ»ΠΈ удалСния ΠΈΠ· Π½Π΅Π³ΠΎ старых Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ². Π­Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ лишь ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²; ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ; ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, добавляСм ΠΈΠ»ΠΈ ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ; ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅.

ΠžΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с Ρ‚Ρ€Π΅Π΄ΠΏΡƒΠ»ΠΎΠΌ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Π²Ρ‹ΡˆΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ настроСк Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡƒΠ» с нуля.

Казалось Π±Ρ‹, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ экономичнСС. Надо Π½Π°ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 101-ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΌΡ‹ Π½Π΅ занимаСмся бСссмыслСнным ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ созданиСм Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ сотни. ΠœΡ‹ просто создаём Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΈ добавляСм Π² ΠΏΡƒΠ». Однако я Π²Ρ‹Π±Ρ€Π°Π» Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ API ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π΅Π΅ ΠΈ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ характСристики Π΄Π²ΠΈΠΆΠΊΠ°, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСство Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ². Π›ΡŽΠ±ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ β€” это ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ Π² соотвСтствии с Π½ΠΎΠ²Ρ‹ΠΌΠΈ настройками. Π£ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, кстати, Π±Ρ‹Π» Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт: стало Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ сущСствованиС Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π²ΠΈΠΆΠΊΠΎΠ². Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ уничтоТаСтся, Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠΌ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, ΠΎΠ½ Π½Π΅ связан со старым ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ.

«Настоящих» Π΄Π²ΠΈΠΆΠΊΠΎΠ² (Π½Π΅ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΎΠΊ) Π² настоящСС врСмя доступно Π΄Π²Π° Ρ‚ΠΈΠΏΠ°: синхронный ΠΈ асинхронный, ΠΊΠ°ΠΊ я ΡƒΠΆΠ΅ писал Π²Ρ‹ΡˆΠ΅. Π˜Ρ… ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π²ΠΎΡ‚ такая ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠ°Ρ функция:

Если Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (настройка pool_size ) большС нуля, Ρ‚ΠΎ создаётся асинхронный Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π° Π±Π°Π·Π΅ Ρ‚Ρ€Π΅Π΄ΠΏΡƒΠ»Π°. А Ссли Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ создаётся Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ синхронный Π΄Π²ΠΈΠΆΠΎΠΊ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚ Ρ‚Ρ€Π΅Π΄ΠΏΡƒΠ»Π°, Π° Π΅ΡΡ‚ΡŒ просто ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π»ΠΎΠ³ ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½.

Для понимания, ΠΊΠ°ΠΊ выглядит ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ, синхронная вСрсия выглядит Ρ‚Π°ΠΊ:

Π­Ρ‚ΠΎ всё. ΠœΠ΅Ρ‚ΠΎΠ΄ самоуничтоТСния спрятан Π² классС, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ наслСдуСтся Π΄Π²ΠΈΠΆΠΎΠΊ, ΠΈ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… рСсурсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ.

Асинхронный Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС, вСдь ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΌΠ΅Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ, Π½Π΅ потСряв Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π»ΠΎΠ³Π° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π° Π½Π΅Π³ΠΎ Ρ‚ΠΎΠΆΠ΅ глянСм, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΠ΄Ρ‚ΠΈ дальшС:

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, вся Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡƒΠ»Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ провалимся Π² Π½Π΅Π³ΠΎ:

Π˜Ρ‚Π°ΠΊ, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡƒΠ»Π° происходит Π² Ρ‚Ρ€ΠΈ этапа:

ДоТидаСмся, ΠΏΠΎΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с Π»ΠΎΠ³Π°ΠΌΠΈ опустССт. ΠŸΡ€ΠΈ этом Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны Π΅Ρ‘ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ пополнял, Π½ΠΎ ΠΎΠ± этом Π±ΡƒΠ΄Π΅Ρ‚ дальшС. ОТиданиС опустСния ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ β€” это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ пуста.

Π‘ΠΎΠΎΠ±Ρ‰Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π²ΠΎΡ€ΠΊΠ΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ€Π° Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π½Π° Ρ€ΡƒΠΊΠ°Ρ… Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ послСдний взятый ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π»ΠΎΠ³, поэтому ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ насильно ΠΈ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π²Π΅ΠΆΠ»ΠΈΠ²ΠΎ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ. Π’ΠΎΡ€ΠΊΠ΅Ρ€, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ (Π½Π° это ΠΌΡ‹ посмотрим дальшС), ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ с послСдним взятым ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π»ΠΎΠ³ΠΎΠΌ, послС Ρ‡Π΅Π³ΠΎ Π΄ΠΎΠ±Ρ€ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ ΡΡƒΠΈΡ†ΠΈΠ΄Π½ΡƒΡ‚ΡŒΡΡ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ собствСнный Ρ†ΠΈΠΊΠ».

Π”ΠΆΠΎΠΉΠ½ΠΈΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ с Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠΌ.

Π’Π½ΡƒΡ‚Ρ€ΠΈ Π²ΠΎΡ€ΠΊΠ΅Ρ€Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния ΠΎΠ± остановкС выглядит ΠΊΠ°ΠΊ установка Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True Ρ„Π»Π°Π³Π° self.stopped :

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

Π’Ρ‹ΡˆΠ΅ ΠΌΡ‹ выяснили, ΠΊΠ°ΠΊ происходит Ρ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ остановка Π΄Π²ΠΈΠΆΠΊΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ здСсь ΠΌΠ½Π΅ придётся Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π·Π°Π΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎ ΠΏΠ°Ρ€Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅ Π΄Π²ΠΈΠΆΠΊΠ° Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всё это врСмя Π΅Π³ΠΎ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΎΠ³Π³Π΅Ρ€Ρ‹ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², поэтому ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ Π΄Π²ΠΈΠΆΠΊΠ° ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ. Код Π½ΠΈΠΆΠ΅ дСмонстрируСт, ΠΊΠ°ΠΊ происходит Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄Π²ΠΈΠΆΠΊΠ° ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅:

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, любой ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ попытаСтся Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΠΎΠ³ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΏΠΎΠΊΠ° Π΄Π²ΠΈΠΆΠΎΠΊ пСрСзагруТаСтся, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° всё ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ². Π›ΠΎΠ³ Π±ΡƒΠ΄Π΅Ρ‚ записан ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ ΠΈ Π½Π΅ потСряСтся.

Если Π²Ρ‹ Π΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π΄ΠΎ этого мСста ΠΈ всё Π΅Ρ‰Ρ‘ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ поняли, Ρ‚ΠΎ Π²ΠΎΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ пСрСсказ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ происходит ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΠΏΡƒΠ½ΠΊΡ‚Π° pool_size :

Π£ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² настроСк схСма ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅, Π½ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

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

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

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

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

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