asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄

РСализация асинхронности Π² Python с ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ asyncio

АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ соврСмСнных языков программирования, которая позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½Π΅ доТидаясь ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ популярности Node.js.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для поиска ΠΏΠΎ сСти, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ тысячу соСдинСний. МоТно ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ соСдинСниС, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ, двигаясь ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Однако это Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Π΅Π΄ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ соСдинСниС β€” опСрация, которая Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ врСмя. И всС это врСмя ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ находятся Π² процСссС оТидания.

А Π²ΠΎΡ‚ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ прСдоставляСт способ открытия тысячи соСдинСний ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. По сути, появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ соСдинСниС ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ, оТидая ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ. Π’Π°ΠΊ продолТаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° всС Π½Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. ispolzovanii asinhronnosti. asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄-ispolzovanii asinhronnosti. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ispolzovanii asinhronnosti. АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ соврСмСнных языков программирования, которая позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½Π΅ доТидаясь ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ популярности Node.js.

На Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ синхронный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π·Π°ΠΉΠΌΠ΅Ρ‚ 45 сСкунд, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ использовании асинхронности врСмя выполнСния ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄ΠΎ 20 сСкунд.

Π“Π΄Π΅ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ примСняСтся Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅?

ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ большС всСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ‚Π°ΠΊΠΈΡ… сцСнариСв:

Π Π°Π·Π½ΠΈΡ†Π° Π² понятиях ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°, concurrency, поточности ΠΈ асинхронности

ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ β€” это Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π·Π° Ρ€Π°Π·. ΠœΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π·Π°Π΄Π°Ρ‡, Π½Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΡ… CPU.

Concurrency β€” Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ понятиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ описываСт нСсколько Π·Π°Π΄Π°Ρ‡, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ с ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

ΠŸΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ β€” ΠΏΠΎΡ‚ΠΎΠΊ β€” это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ выполнСния. Один процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСзависимо. ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для IO-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ, однопроцСссорный Π΄ΠΈΠ·Π°ΠΉΠ½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ создаСт Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΎΠ΄Π½ΠΎΠΌ процСссС.

Π‘ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ асинхронного программирования

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ асинхронного программирования ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π’Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠ΄ для наглядности.

Π‘ΠΎΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π‘ΠΎΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (coroutine) β€” это ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ ΠΈ Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΊΠ°ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Python.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сопрограммы

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

Асинхронный Python: Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ конкурСнтности

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ²:

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ углубимся Π² тСхничСскиС аспСкты, Π²Π°ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ², часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² этом контСкстС.

Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹ΠΈΜ† ΠΈ асинхронный:

Π’ ​синхронных опСрациях Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Π’ асинхронных Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. Одна асинхронная Π·Π°Π΄Π°Ρ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΏΠΎΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½ΠΎΠ²ΠΎΠΈΜ† Π·Π°Π΄Π°Ρ‡Π΅. АсинхронныС Π·Π°Π΄Π°Ρ‡ΠΈ ​нС Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ (Π½Π΅ Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΆΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ) ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

НапримСр, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² туристичСскоС агСнтство, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΈΜ† отпуск. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ письмо своСму Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡƒΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ. Π’ синхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π²Ρ‹ сначала ΠΏΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚Π΅ Π² туристичСскоС агСнтство, ΠΈ Ссли вас попросят ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π²Π°ΠΌ Π½Π΅ отвСтят. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ Π½Π°Ρ‡Π½Π΅ΜˆΡ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ письмо Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ выполняСтС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ΄Π½Π° Π·Π° ΠΎΠ΄Π½ΠΎΠΈΜ†. [синхронноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°] Но, Ссли Π²Ρ‹ ΡƒΠΌΠ½Ρ‹, Ρ‚ΠΎ ΠΏΠΎΠΊΠ° вас попросили ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ [β€‹ΠΏΠΎΠ²ΠΈΡΠ΅Ρ‚ΡŒ Π½Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π΅, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°] Π²Ρ‹ Π½Π°Ρ‡Π½Π΅ΜˆΡ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ e-mail ΠΈ ΠΊΠΎΠ³Π΄Π° с Π²Π°ΠΌΠΈ снова заговорят Π²Ρ‹ приостановитС написаниС, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠΏΠΈΡˆΠ΅Ρ‚Π΅ письмо. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³Π° ΠΏΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ Π² агСнтство, Π° сами Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ письмо. Π­Ρ‚ΠΎ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ, Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ:

ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ совмСстно. Π’ нашСм ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассматривали асинхронный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΡ‹ постСпСнно ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Π»ΠΈΡΡŒ Ρ‚ΠΎ Π² написании письма, Ρ‚ΠΎ Π² Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π΅ с Ρ‚ΡƒΡ€. агСнтством. Π­Ρ‚ΠΎ β€‹ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ.

Когда ΠΌΡ‹ попросили ΠΏΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³Π°, Π° сами писали письмо, Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ β€‹ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ.​

ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ ΠΏΠΎ сути являСтся Ρ„ΠΎΡ€ΠΌΠΎΠΈΜ† конкурСнтности. Но ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ зависит ΠΎΡ‚ оборудования. НапримСр, Ссли Π² CPU Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ядро, Ρ‚ΠΎ Π΄Π²Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Они просто дСлят процСссорноС врСмя ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π’ΠΎΠ³Π΄Π° это ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ, Π½ΠΎ Π½Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ. Но ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ нСсколько ядСр [ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΈΜ† являСтся Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ядром, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°] ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΜ† (Π² зависимости ΠΎΡ‚ количСства ядСр) ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΈ процСссы

Python ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡƒΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π΄Π°Π²Π½ΠΎ. ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎ. Но Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с Global Interpreter Lock (GIL) ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ настоящий ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ. И Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, с появлСниСм multiprocessing ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ядСр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python.

Рассмотрим нСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’ Π½ΠΈΠΆΠ΅ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ функция worker Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… асинхронно ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

А Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…:

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ запустили 5 ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для совмСстной Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ послС ΠΈΡ… старта (Ρ‚.Π΅. послС запуска Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ worker) опСрация Π½Π΅ ΠΆΠ΄Ρ‘Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ print. Π­Ρ‚ΠΎ асинхронная опСрация.

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² конструктор Thread. Если Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ, Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ подкласс с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ (ООП ΡΡ‚ΠΈΠ»ΡŒ).

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ссылкой Π½ΠΈΠΆΠ΅:

GIL Π±Ρ‹Π» прСдставлСн, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ памяти CPython ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с C(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ). GIL β€” это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python запускаСт Π² Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π° Ρ€Π°Π·. Π’.Π΅. Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π΅ Python Π΅Π΄ΠΈΠ½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. GIL слСдит Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ.

ΠšΡ€Π°Ρ‚ΠΊΠΈΠ΅ свСдСния ΠΎ GIL:

Π­Ρ‚ΠΈ рСсурсы позволят ΡƒΠ³Π»ΡƒΠ±ΠΈΡ‚ΡŒΡΡ Π² GIL:

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° Π² Python Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ multiprocessing, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт API, ΠΈ выглядит ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ, Ссли Π²Ρ‹ использовали threading Ρ€Π°Π½ΡŒΡˆΠ΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ просто ΠΏΠΎΠΉΠ΄Π΅ΠΌ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’Π΅ΠΏΠ΅Ρ€ΡŒ модифицированная вСрсия ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠŸΡ€ΠΎΡ†Π΅ΡΡ вмСсто ΠŸΠΎΡ‚ΠΎΠΊΠ°.

Π§Ρ‚ΠΎ ΠΆΠ΅ измСнилось? Π― просто ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» ΠΌΠΎΠ΄ΡƒΠ»ΡŒ multiprocessing вмСсто threading. А Π·Π°Ρ‚Π΅ΠΌ, вмСсто ΠΏΠΎΡ‚ΠΎΠΊΠ° я использовал процСсс. Π’ΠΎΡ‚ ΠΈ всё! Π’Π΅ΠΏΠ΅Ρ€ΡŒ вмСсто мноТСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ процСссы ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ядрах CPU (Ссли, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρƒ вашСго процСссора нСсколько ядСр).

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса Pool ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими процСссами для Ρ€Π°Π·Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

Π—Π΄Π΅ΡΡŒ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ, ΠΌΡ‹ фактичСски запускаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ€Π°Π·Π½Ρ‹Ρ… процСссах. Один процСсс выполняСт f(1), Π΄Ρ€ΡƒΠ³ΠΎΠΉ-f(2), Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ-f (3). НаконСц, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ снова ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² список. Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ тяТСлыС вычислСния Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ части ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ для Π±ΠΎΠ»Π΅Π΅ быстрого расчСта.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ concurrent.futures большой ΠΈ позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ асинхронный ΠΊΠΎΠ΄ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ. Мои Π»ΡŽΠ±ΠΈΠΌΡ‡ΠΈΠΊΠΈ ThreadPoolExecutor ΠΈ ProcessPoolExecutor. Π­Ρ‚ΠΈ исполнитСли ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ процСссов. ΠœΡ‹ отправляСм наши Π·Π°Π΄Π°Ρ‡ΠΈ Π² ΠΏΡƒΠ», ΠΈ ΠΎΠ½ запускаСт Π·Π°Π΄Π°Ρ‡ΠΈ Π² доступном ΠΏΠΎΡ‚ΠΎΠΊΠ΅ / процСссС. ВозвращаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Future, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для запроса ΠΈ получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ.

А Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ThreadPoolExecutor:

Π£ мСня Π΅ΡΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΎ concurrent.futures masnun.com/2016/03/29/python-a-quick-introduction-to-the-concurrent-futures-module.html. Она ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΡ€ΠΈ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΌ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ этого модуля.

Asyncio β€” Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

Π£ вас, вСроятно, Π΅ΡΡ‚ΡŒ вопрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅ΡΡ‚ΡŒ Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΡ… людСй Π² сообщСствС Python β€” Ρ‡Ρ‚ΠΎ asyncio приносит Π½ΠΎΠ²ΠΎΠ³ΠΎ? Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΅Π½ Π±Ρ‹Π» Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ асинхронного Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°? Π Π°Π·Π²Π΅ Ρƒ нас ΡƒΠΆΠ΅ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов? Π”Π°Π²Π°ΠΉ посмотрим!

Π—Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ asyncio?

ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ ΠΎΡ‡Π΅Π½ΡŒ дорогостоящиС [с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния потрСблСния рСсурсов, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°] для создания. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π² основном Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ зависит ΠΎΡ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ β€” ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ диски ΠΈΠ»ΠΈ нСприятныС сСтСвыС Π»Π°Π³ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ часто нСпрСдсказуСмым. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. 3 ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. НазовСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ β€” T1, T2 ΠΈ T3. Π’Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π°Ρ‡Π°Π»ΠΈ свою ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. T3 Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. T2 ΠΈ T1 всС Π΅Ρ‰Π΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π½Π° T1, Π½ΠΎ ΠΎΠ½ всС Π΅Ρ‰Π΅ ΠΆΠ΄Π΅Ρ‚. Π₯ΠΎΡ€ΠΎΡˆΠΎ, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ пСрСмСщаСтся Π² T2, Π° Ρ‚ΠΎΡ‚ всС Π΅Ρ‰Π΅ ΠΆΠ΄Π΅Ρ‚, Π° Π·Π°Ρ‚Π΅ΠΌ пСрСмСщаСтся Π² T3, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³ΠΎΡ‚ΠΎΠ² ΠΈ выполняСт ΠΊΠΎΠ΄. Π’Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π² этом ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ?

T3 Π±Ρ‹Π» Π³ΠΎΡ‚ΠΎΠ², Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ сначала ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ T2 ΠΈ T1 β€” это понСсло расходы Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, Ссли Π±Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ сначала ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ Π½Π° T3, Π²Π΅Ρ€Π½ΠΎ?

Asyncio прСдоставляСт Π½Π°ΠΌ Ρ†ΠΈΠΊΠ» событий наряду с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΡ€ΡƒΡ‚Ρ‹ΠΌΠΈ Π²Π΅Ρ‰Π°ΠΌΠΈ. Π¦ΠΈΠΊΠ» событий (event loop) отслСТиваСт события Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΈ ΠΆΠ΄ΡƒΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° [Ρ†ΠΈΠΊΠ» событий β€” программная конструкция, которая ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ прибытия ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ рассылку событий ΠΈΠ»ΠΈ сообщСний Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°].

ИдСя ΠΎΡ‡Π΅Π½ΡŒ проста. Π•ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий. И Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ свои Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Ρƒ событий ΠΈ просим Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… для нас. Π¦ΠΈΠΊΠ» событий Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Future, словно ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΡ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ. ΠœΡ‹ дСрТимся Π·Π° ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅, врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ провСряСм, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π½Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ тСрпится), ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… опСрациях [Ρ‚.Π΅. ΠΌΡ‹ послали запрос, Π½Π°ΠΌ сразу Π΄Π°Π»ΠΈ Π±ΠΈΠ»Π΅Ρ‚ ΠΈ сказали ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠœΡ‹ пСриодичСски провСряСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ Π±ΠΈΠ»Π΅Ρ‚ ΠΈ ΠΏΠΎ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°].

Asyncio ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ для остановки ΠΈ возобновлСния Π·Π°Π΄Π°Ρ‡. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ здСсь:

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ синтаксис async/await ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Python 3.5 ΠΈ Π²Ρ‹ΡˆΠ΅. ΠŸΡ€ΠΎΠΉΠ΄Ρ‘ΠΌΡΡ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ:

Π”Π΅Π»Π°Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€

Волько Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈΡΡŒ ΠΏΠΎ самым популярным Ρ„ΠΎΡ€ΠΌΠ°ΠΌ конкурСнтности. Но остаётся вопрос β€” Ρ‡Ρ‚ΠΎ слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ? Π­Ρ‚ΠΎ зависит ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования. Из ΠΌΠΎΠ΅Π³ΠΎ ΠΎΠΏΡ‹Ρ‚Π° я склонСн ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этому псСвдо-ΠΊΠΎΠ΄Ρƒ:

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

ΠžΠ±Π·ΠΎΡ€ Async IO Π² Python 3.7

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΎΠ±Π·ΠΎΡ€Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ: Guest Contributor Overview of Async IO in Python 3.7
Π‘ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° для ввСдСния Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ asyncio

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Python 3 asyncio прСдоставляСт Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ асинхронного Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π² Python. Он Π±Ρ‹Π» прСдставлСн Π² Python 3.4, ΠΈ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π΅Π»ΠΈΠ·ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ развивался.

Π­Ρ‚ΠΎ ΡΡ‚Π°Ρ‚ΡŒΡ содСрТит ΠΎΠ±Ρ‰ΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ асинхронной ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ ΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Python 3.7.

Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ пытаСтся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒΡŽ, β€” это Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° обращаСтся ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ· источника Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΎΠ½Π° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΎΡ‚ продолТСния выполнСния Π²ΠΎ врСмя доступа ΠΊ физичСскому устройству ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ распространСнным ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ сСтСвыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°, вызванная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°. Однако Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ. Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ чтСния Ρ„Π°ΠΉΠ»Π° 1010 ΠΈΠ»ΠΈ сСтСвых Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ снизится.

ΠœΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΠΎΡΡ‚ΡŒ, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ

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

ΠœΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

ΠœΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° β€” это Ρ„ΠΎΡ€ΠΌΠ° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ инструкции Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π°ΠΌΠΊΠ°Ρ… Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… физичСских процСссорах ΠΈΠ»ΠΈ ядрах. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ ядром, нСсСт Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ нСзависимо Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ кусок памяти (heap).

Python Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля multiprocessing.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Python 3, которая ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСсса, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ. Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ элСмСнта, систСмноС врСмя Π΄ΠΎ ΠΈ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΈ ΠΏΠΈΠΊΠΎΠ²ΠΎΠ΅ распрСдСлСниС памяти Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния:

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ

ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ многопроцСссорности, с прСимущСствами ΠΈ нСдостатками.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ нСзависимо ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, ΠΈ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Однако, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ многопроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π² ΠΎΠ΄Π½ΠΎΠΌ процСссС ядра ΠΈ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½Ρƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ (heap).

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Python ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ (concurrent) β€” нСсколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ машинного ΠΊΠΎΠ΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π°ΠΌΠΊΠ°Ρ…. Но Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ β€” Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ происходит ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… физичСских ядрах.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ нСдостатками ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Python ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ памяти (memory safety) ΠΈ состояниС Π³ΠΎΠ½ΠΊΠΈ (race conditions). ВсС Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ пространствС ΠΎΠ±Ρ‰Π΅ΠΉ памяти. Π‘Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… срСдств Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² памяти, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ± этом Π½Π΅ ΡƒΠ·Π½Π°ΡŽΡ‚. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ катастрофичСскиС послСдствия.

Для обСспСчСния бСзопасности ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CPython ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (GIL). GIL β€” это ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… Python. ЀактичСски это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ.

Π’ΠΎΡ‚ потоковая вСрсия ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° многопроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ Ρ‡Ρ‚ΠΎ измСнилось: multiprocessing.Process Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° threading.Thread. Как ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, всС происходит Π·Π° ΠΎΠ΄ΠΈΠ½ процСсс, ΠΈ объСм памяти Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния:

ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ

ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ являСтся Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ многопоточности для написания ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. АсинхронныС события происходят нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° (Π½Π΅ синхронизированно Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ), ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ многопоточности, Π² асинхронных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… программист ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΈ ΠΊΠ°ΠΊ происходит ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ вытСснСниС, облСгчая ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ ΠΈ избСгая условий Π³ΠΎΠ½ΠΊΠΈ.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Python 3.7 asyncio

Π’ Python 3.7 асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ asyncio.

High-Level ΠΏΡ€ΠΎΡ‚ΠΈΠ² Low-Level asyncio API

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Asyncio ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π½Π° API-интСрфСйсы высокого уровня (для написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ) ΠΈ API-интСрфСйсы Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня (для написания Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΠ»ΠΈ срСд Π½Π° основС asyncio).

КаТдая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° asyncio ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ написана с использованиСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ высокоуровнСвых API. Если Π²Ρ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π²Π°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Ρ€ΠΎΠ³Π°Ρ‚ΡŒ API Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня.

Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим основныС высокоуровнСвыС API ΠΈ обсудим основныС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ.

ΠšΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ (Coroutines)

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, coroutine (сокращСниС ΠΎΡ‚ cooperative subroutine) β€” это ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, прСдназначСнная для Π΄ΠΎΠ±Ρ€ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ многозадачности: ΠΎΠ½Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ уступаСт свои рСсурсы Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ ΠΈ процСссам, Π° Π½Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ вытСсняСтся ядром. Π’Π΅Ρ€ΠΌΠΈΠ½ Β«coroutineΒ» Π±Ρ‹Π» ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ Π² 1958 Π³ΠΎΠ΄Ρƒ МСлвином КонвССм (Π² Conway’s Law), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сам освобоТдаСт свои рСсурсы для Π΄Ρ€ΡƒΠ³ΠΈΡ… частСй систСмы.

Π’ asyncio это Ρ‚Π°ΠΊ ΠΆΠ΅ называСтся awaiting.

Awaitables, Async, ΠΈ Await

Π›ΡŽΠ±ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ своСго процСсса выполнСния, называСтся awaitable.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово await приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (coroutine) ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ awaitable.

Π’ Python 3.7 Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (awaitable) β€” coroutine, task ΠΈ future.

Coroutine Π² asyncio β€” это любая функция Python, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Π½ прСфикс async.

task Π² asyncio β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ coroutine, прСдоставляя ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для контроля Π΅Π΅ выполнСния ΠΈ запроса Π΅Π΅ статуса. task ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ asyncio.create_task() ΠΈΠ»ΠΈ asyncio.gather().

future Π² asyncio β€” это Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт Ρ€ΠΎΠ»ΡŒ заполнитСля для Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ рассчитаны ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡƒΡΡ‚ΡƒΡŽ структуру для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ заполнСния Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ срабатываСт, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² Python 3.7 Π²Π°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ future.

Event Loops

Π’ asyncio event loop (Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий) управляСт ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². event loop трСбуСтся для использования awaitables. КаТдая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° asyncio ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ event loop. МоТно ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько event loop, Π½ΠΎ Π² Python 3.7 Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ event loop.

Бсылка Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ†ΠΈΠΊΠ»Π° получаСтся ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° asyncio.get_running_loop().

Sleeping

ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° asyncio.sleep(delay) блокируСтся Π½Π° сСкунды Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ. Π­Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Event Loop

ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ asyncio являСтся asyncio.run(main()), Π³Π΄Π΅ main () β€” ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° (coroutine) Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня.

Π’Ρ‹Π·ΠΎΠ² asyncio.run() нСявно создаСт ΠΈ запускаСт event loop (Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий). Π£ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ†ΠΈΠΊΠ»Π° Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ loop.time(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя, ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ часами Ρ†ΠΈΠΊΠ»Π°.

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

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ строки тСкста, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡΡΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ сСкунду послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния:

Π—Π°Π΄Π°Ρ‡ΠΈ (Task)

Π—Π°Π΄Π°Ρ‡Π° β€” это awaitable (ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ оборачиваСтся Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (coroutine). Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ сразу Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Ρ†ΠΈΠΊΠ»Ρƒ: «Иди ΠΈ запусти эту coroutine (ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ), ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ смоТСшь».

Если Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅ (await) Π·Π°Π΄Π°Ρ‡Ρƒ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ coroutine блокируСтся, ΠΏΠΎΠΊΠ° эта Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния:

Π—Π°Π΄Π°Ρ‡ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для управлСния ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ (coroutine). Π’ частности, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Π½Ρƒ Π·Π°Π΄Π°Ρ‡ΠΈ, Π²Ρ‹Π·Π²Π°Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ .cancel(). Π—Π°Π΄Π°Ρ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π° для ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ Ρ†ΠΈΠΊΠ»Π° событий. ΠžΡ‚ΠΌΠ΅Π½Π° Π½Π΅ гарантируСтся: Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π΄ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° Ρ†ΠΈΠΊΠ»Π°, ΠΈ Π² этом случаС ΠΎΡ‚ΠΌΠ΅Π½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

Π‘Π±ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Awaitable

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ awaitable ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ собраны Π² Π³Ρ€ΡƒΠΏΠΏΡƒ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ asyncio.gather(awaitables).

Asyncio.gather() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ awaitable, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ собранныС awaitable значСния.

Π‘Π±ΠΎΡ€ β€” это ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² качСствС Π·Π°Π΄Π°Ρ‡. Он Ρ‚Π°ΠΊΠΆΠ΅ связываСт собранныС Π·Π°Π΄Π°Ρ‡ΠΈ нСсколькими ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ способами:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: асинхронныС Π²Π΅Π±-запросы с aiohttp

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ это высокоуровнСвоС асинхронноС API. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° измСнСнная вСрсия, обновлСнная для Python 3.7, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Asyncio Π‘ΠΊΠΎΡ‚Ρ‚Π° Робинсона (Scott Robinson’s nifty asyncio). Π•Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ aiohttp для Π·Π°Ρ…Π²Π°Ρ‚Π° Π²Π΅Ρ€Ρ…Π½ΠΈΡ… постов Π² Reddit ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΡ… Π½Π° консоль.

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ вас установлСн ΠΌΠΎΠ΄ΡƒΠ»ΡŒ aiohttp, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ скрипт Π½ΠΈΠΆΠ΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pip:

asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. overview async io python 3 7 1. asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄-overview async io python 3 7 1. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° overview async io python 3 7 1. АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ соврСмСнных языков программирования, которая позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½Π΅ доТидаясь ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ популярности Node.js.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ высокоуровнСвоС API

НадССмся, Ρ‡Ρ‚ΠΎ этот ΠΎΠ±Π·ΠΎΡ€ даст Π²Π°ΠΌ основу понимания Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ, ΠΊΠΎΠ³Π΄Π° ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ asyncio. Π”Ρ€ΡƒΠ³ΠΈΠ΅ высокоуровнСвыС API-интСрфСйсы asyncio, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ здСсь Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя:

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

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ асинхронности, Π²Ρ‹ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ asyncio, ΠΏΠΎ сообраТСниям ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π― надСюсь, Ρ‡Ρ‚ΠΎ этот ΠΎΠ±Π·ΠΎΡ€ даст Π²Π°ΠΌ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ, ΠΊΠΎΠ³Π΄Π° ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ asyncio.

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

Π§Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ asyncio

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ со ΠΌΠ½ΠΎΠΉ Π² ΠΌΠ΅Ρ€Ρƒ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠ΅ Π² Π½Π΅Π΄Ρ€Π° asyncio, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ Π² Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ асинхронноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. ΠœΡ‹ осСдлаСм коллбэки ΠΈ промчимся ΠΏΠΎ Ρ†ΠΈΠΊΠ»Ρƒ событий сквозь ΠΏΠ°Ρ€Ρƒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… абстракций прямо Π² ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρƒ. Если Π½Π° вашСй ΠΊΠ°Ρ€Ρ‚Π΅ ΠΏΠΈΡ‚ΠΎΠ½Π° Π΅Ρ‰Π΅ Π½Π΅Ρ‚ этих Π΄ΠΎΡΡ‚ΠΎΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ, Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

Для Π·Π°Ρ‚Ρ€Π°Π²ΠΊΠΈ β€” краткая справка ΠΎ Ρ€Π°ΡΠΊΠΈΠ½ΡƒΠ²ΡˆΠ΅ΠΉΡΡ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ мСстности

asyncio β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° асинхронного Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° которая, согласно pep3153, Π±Ρ‹Π»Π° создана, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π±Π°Π·Ρƒ для создания асинхронных Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ². pep3156 Ρ‚Π°ΠΊ ΠΆΠ΅ приписываСт Π΅ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ Π² ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ асинхронныС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ (Twisted, Tornado, Gevent). Как ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ сСйчас Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, эти Ρ†Π΅Π»ΠΈ Π±Ρ‹Π»ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ достигнуты β€” появился Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π½Π° основС asyncio: aiohttp, Π² Tornado AsyncioMainLoop являСтся Ρ†ΠΈΠΊΠ»ΠΎΠΌ событий ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с вСрсии 5.0, Π² Twisted asyncioreactor доступСн с вСрсии 16.5.0, Π° для Gevent Π΅ΡΡ‚ΡŒ сторонняя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° aiogevent.

asyncio β€” это гибридная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π²Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ асинхронного выполнСния ΠΊΠΎΠ΄Π°: классичСский Π½Π° коллбэках ΠΈ, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ, (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ для ΠΏΠΈΡ‚ΠΎΠ½Π°) Π½Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°Ρ…. Π’ Π΅Ρ‘ основС Π»Π΅ΠΆΠ°Ρ‚ Ρ‚Ρ€ΠΈ основныС абстракции, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π°Π½Π°Π»ΠΎΠ³Π°ΠΌΠΈ абстракций, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² сторонних Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ…:

ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ!

Π¦ΠΈΠΊΠ» событий β€” основная ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎ Π΄ΠΎΡ€ΠΎΠ³Π°ΠΌ, ΠΏΡ€ΠΎΠ»Π΅Π³Π°ΡŽΡ‰ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ, Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π»ΡŽΠ±Ρ‹Π΅ Π΅Ρ‘ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Он большой ΠΈ слоТный, поэтому сначала рассмотрим Π΅Π³ΠΎ ΡƒΡ€Π΅Π·Π°Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

ОсСдлав наш малСнький коллбэк, ΠΌΡ‹ отправляСмся Π² ΠΏΡƒΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· call_soon, ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ послС ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ³ΠΎ оТидания Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ Π½Π° экран.

Π­ΠΏΠΈΠ·ΠΎΠ΄ ΠΏΡ€ΠΎ ΠΏΠ»ΠΎΡ…ΠΈΠ΅ коллбэки

Π‘Ρ‚ΠΎΠΈΡ‚ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ коллбэки это опасныС лошадки β€” Ссли ΠΎΠ½ΠΈ сбросят вас посрСди Π΄ΠΎΡ€ΠΎΠ³ΠΈ, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΏΠΈΡ‚ΠΎΠ½Π° Π½Π΅ смоТСт ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π³Π΄Π΅ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ. Если Π½Π΅ Π²Π΅Ρ€ΠΈΡ‚Π΅, ΠΏΠΎΠΊΠ°Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΄ΠΎΡ€ΠΎΠ³ΠΎΠΉ Π½Π° коллбэкС maybe_print, приходящСм ΠΊ Ρ„ΠΈΠ½ΠΈΡˆΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ случаСв.

НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ трСйсбэк запуска ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ функция maybe_print Π±Ρ‹Π»Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Ρ†ΠΈΠΊΠ»ΠΎΠΌ событий, Π° Π½Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· starting_point, трСйсбэк заканчиваСтся ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Π½Ρ‘ΠΌ, Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ run_until_complete. По Ρ‚Π°ΠΊΠΎΠΌΡƒ трСйсбэку Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π³Π΄Π΅ Π² ΠΊΠΎΠ΄Π΅ находится starting_point, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ услоТнит ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ, Ссли starting_point Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹.

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

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ контСкста Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΈ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ Ρ„Π°ΠΉΠ» Π΅Ρ‰Ρ‘ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°.

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ использованиС ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹Ρ… возмоТностСй языка. Для частичного ΠΎΠ±Ρ…ΠΎΠ΄Π° этого нСдостатка Π² asyncio ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π½Π΅ относящeгося Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄, ΠΏΠΎ большСй части, отсутствуСт Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… β€” ΠΎΠ½ΠΈ ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ довольно слоТны.

Из Ρ†ΠΈΠΊΠ»Π° событий Π²ΠΎ внСшний ΠΌΠΈΡ€ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ

Π¦ΠΈΠΊΠ» событий сообщаСтся с внСшним ΠΌΠΈΡ€ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму посрСдством событий. Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ с Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, прСдоставляСтся ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ selectors. Он позволяСт ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΆΠ΄Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ события, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π»ΠΈ ΠΎΠ½ΠΎ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ событиСм Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ сокСта Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

Π“ΠΎΠ½Π΅Ρ† ΠΈΠ· внСшнСго ΠΌΠΈΡ€Π° оставляСт своё сообщСниС ΠΈΠ»ΠΈ посылку Π² сСлСкторС, Π° сСлСктор ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π΅Ρ‘ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŽ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ стало Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· сокСта, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ†ΠΈΠΊΠ» событий. Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ netcat, Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ добросовСстно Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ всё, Ρ‡Ρ‚ΠΎ Π² Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ.

Π’ Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ asyncio β€” гибридная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ… коллбэков. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ основныС абстракции: Task ΠΈ Future. Π”Π°Π»Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΊΠΎΠ΄ этих абстракций, Π° Π·Π°Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡ… Ρ†ΠΈΠΊΠ» событий, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹.

Future

НиТС прСдставлСн ΠΊΠΎΠ΄ класса Future. Он Π½ΡƒΠΆΠ΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния коллбэка ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π­Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ подкласс класса Future. Он Π½ΡƒΠΆΠ΅Π½ для запуска ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Π½Π° коллбэчном Ρ†ΠΈΠΊΠ»Π΅ событий.

Π¦ΠΈΠΊΠ» событий, ΡƒΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Future

ДвинСмся дальшС

Π’Π΅ΠΏΠ΅Ρ€ΡŒ прослСдим Π·Π° Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° main Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ:

Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌ Π½Π΅Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΌ способом asyncio выполняСт ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹.

Π˜Ρ‚ΠΎΠ³ΠΈ

Один ΠΈΠ· Ρ†Π΅Π»Π΅ΠΉ создания asyncio Π±Ρ‹Π»ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ Π² ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ асинхронныС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ (Twisted, Tornado, Gevent). Из этой Ρ†Π΅Π»ΠΈ логичСски Π²Ρ‹Ρ‚Π΅ΠΊΠ°Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€ инструмСнтов: Ссли Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ трСбования совмСстимости, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌ Π±Ρ‹Π»Π° Π±Ρ‹ ΠΎΡ‚Π΄Π°Π½Π° главная Ρ€ΠΎΠ»ΡŒ. Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° коллбэках Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΉ стэк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΠΈ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠΈ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ систСму, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΠΏΠΈΡ€Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° Π½Π΅Π³ΠΎ возмоТностСй языка.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π³Π»Π°Π²Π½Ρ‹ΠΉ вопрос. Π—Π°Ρ‡Π΅ΠΌ всё это Π·Π½Π°Ρ‚ΡŒ простому ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт рСкомСндациям ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ лишь ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΈ высокоуровнСвый API?
Π’ΠΎΡ‚ кусок Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ класса StreamWriter

asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. image loader. asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄-image loader. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° asyncio ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° image loader. АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ соврСмСнных языков программирования, которая позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½Π΅ доТидаясь ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ популярности Node.js.

Π•Π³ΠΎ экзСмпляр возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ asyncio.open_connection ΠΈ являСтся async/await API ΠΏΠΎΠ²Π΅Ρ€Ρ… API Π½Π° коллбэках. И эти коллбэки ΠΈΠ· Π½Π΅Π³ΠΎ Ρ‚ΠΎΡ€Ρ‡Π°Ρ‚. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ write ΠΈ writelines синхронныС, ΠΎΠ½ΠΈ ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² сокСт, Π° Ссли Π½Π΅ получаСтся, Ρ‚ΠΎ ΡΠ±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ коллбэки Π½Π° запись. ΠšΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° drain Π½ΡƒΠΆΠ½Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠΊΠ° количСство Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΡƒΡ„Π΅Ρ€Π΅ Π½Π΅ опустится Π΄ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ значСния.

Если Π·Π°Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ drain ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ write, Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°ΡΡ‚ΠΈΡΡŒ Π΄ΠΎ Π½Π΅ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². Однако, Ссли ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ± этом, Ρ‚ΠΎ остаСтся ΠΏΠ°Ρ€Π° нСприятных ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ: Ссли коллбэк Π½Π° запись «сломаСтся», Ρ‚ΠΎ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ этот API Π½ΠΈΠΊΠ°ΠΊ ΠΎΠ± этом Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΈ, соотвСтствСнно, Π½Π΅ смоТСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ: Ссли ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° «сломаСтся», Ρ‚ΠΎ коллбэк Π½Π° запись Π½ΠΈΠΊΠ°ΠΊ ΠΎΠ± этом Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π°.

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

О Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· асинхронного ΠΊΠΎΠ΄Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ нашСго ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠ³Π° Antida software.

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

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

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