Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Asyncio (python) с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ

asyncio - это ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт инструмСнты для написания асинхронного (ΠΈΠ»ΠΈ non-blocking) ΠΊΠΎΠ΄Π°. АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт эффСктивно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ мноТСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° (I/O) Π±Π΅Π· блокирования основного ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния.

НСкоторыС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ asyncio Π² Python Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  1. Coroutines (ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹): Π­Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π²ΠΎ врСмя выполнСния. Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² асинхронном ΠΊΠΎΠ΄Π΅ для обозначСния асинхронных Π·Π°Π΄Π°Ρ‡.
  2. Event Loop (Ρ†ΠΈΠΊΠ» событий): Основной ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ asyncio, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ исполнСниСм асинхронного ΠΊΠΎΠ΄Π°. Он отслСТиваСт ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΈ управляСт ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π² асинхронной срСдС.
  3. Futures (Ρ„ΡŒΡŽΡ‡Π΅Ρ€ΡΡ‹): Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.
  4. Tasks (Π·Π°Π΄Π°Ρ‡ΠΈ): Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Π² Ρ†ΠΈΠΊΠ»Π΅ событий asyncio.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования asyncio для запуска асинхронной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

import asyncio

async def my_async_function():
    print("Doing some asynchronous work")

async def main():
    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π° событий
    loop = asyncio.get_event_loop()

    # Запуск асинхронной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    await my_async_function()

# Запуск основной асинхронной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
asyncio.run(main())

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² сСтСвом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π²Π΅Π±-сСрвСрах, микросСрвисах ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… асинхронных прилоТСниях Π² Python. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ использованиС asyncio позволяСт ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π² прилоТСниях, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… асинхронного выполнСния Π·Π°Π΄Π°Ρ‡.


ΠšΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹

ΠšΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ (Coroutines) Π² Python ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ приостановлСны Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ (yield) ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅. Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² асинхронном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π±Π΅Π· нСобходимости создания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ процСссов.

Π’ языкС Python ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ созданы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова async def ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда вызываСтся асинхронная функция (ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ await, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Ρ†ΠΈΠΊΠ» событий asyncio, позволяя Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌ ΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ характСристики ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ Π² Python:

  1. ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ: ΠšΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для выполнСния Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, позволяя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡, ΠΏΠΎΠΊΠ° ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ асинхронного события.
  2. ΠœΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: ΠšΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСсколько асинхронных Π·Π°Π΄Π°Ρ‡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Python, управляСмого Ρ†ΠΈΠΊΠ»ΠΎΠΌ событий.
  3. Π›Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΠΎΡΡ‚ΡŒ: Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ многопоточности, ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ лСгковСсны ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° созданиС ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ процСссами.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ опрСдСлСния ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Π² Python:

import asyncio

async def example_coroutine():
    print("Start")
    await asyncio.sleep(1)  # Асинхронная опСрация Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π° 1 сСкунду
    print("Finish")

async def main():
    await example_coroutine()

# Запуск основной асинхронной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
asyncio.run(main())

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


Event Loop

Event Loop (Π¦ΠΈΠΊΠ» Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠΉ) являСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Π² асинхронном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, особСнно ΠΏΡ€ΠΈ использовании Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ asyncio Π² Python. Event Loop эффСктивно управляСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ асинхронного ΠΊΠΎΠ΄Π°, планируя ΠΈ координируя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅, Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ основного ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния.

Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основныС аспСкты Event Loop:

  1. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ асинхронным ΠΊΠΎΠ΄ΠΎΠΌ: Event Loop прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для выполнСния мноТСства асинхронных Π·Π°Π΄Π°Ρ‡ (ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½) ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π±Π΅Π· использования многопоточности. Он слСдит Π·Π° Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ контСкст выполнСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ.
  2. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΡ: Event Loop ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹, приостановлСны ΠΈΠ»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
  3. ЦСнтрализация: Event Loop слуТит Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ управлСния исполнСниСм асинхронного ΠΊΠΎΠ΄Π°. Он обСспСчиваСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ событий ΠΈ Π·Π°Π΄Π°Ρ‡ Π² Π΅Π΄ΠΈΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ управлСния.
  4. Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ: ИспользованиС Event Loop ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡ Π²ΠΎ врСмя оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Event Loop с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ asyncio Π² Python:

import asyncio

async def example_coroutine():
    print("Start")
    await asyncio.sleep(1)  # Асинхронная опСрация Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π° 1 сСкунду
    print("Finish")

async def main():
    await example_coroutine()

# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Event Loop ΠΈ запуск асинхронной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

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


Future

Future (Π€ΡŒΡŽΡ‡Π΅Ρ€Ρ) - это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ asyncio Π² Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΈΠ»ΠΈ асинхронноС вычислСниС. Future ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСдставлСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доступСн Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎ Future:

  1. ΠžΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Future прСдставляСт собой ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
  2. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ асинхронными опСрациями: Future позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ становятся доступными.
  3. ОТиданиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° await Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Future ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π΅ выполнСния.
  4. Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ: Future прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для увСдомлСния ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· коллбэки ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ асинхронныС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Future Π² asyncio:

import asyncio

async def mock_async_operation():
    await asyncio.sleep(2)
    return "Async operation completed"

async def main():
    future = asyncio.ensure_future(mock_async_operation())
    await future
    print("Result:", future.result())

# Запуск Event Loop ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

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


Tasks

Tasks (Π—Π°Π΄Π°Ρ‡ΠΈ) Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ asyncio Π² Python ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²ΠΈΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ†ΠΈΠΊΠ»Π° событий. Tasks ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для управлСния ΠΈ отслСТивания выполнСния асинхронных Π·Π°Π΄Π°Ρ‡ Π² асинхронном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

Π’Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎ Tasks:

  1. ИсполнСниС асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: Task прСдставляСт собой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π² контСкстС Ρ†ΠΈΠΊΠ»Π° событий asyncio.
  2. ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ прогрСсса: Tasks ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для отслСТивания прогрСсса выполнСния асинхронных Π·Π°Π΄Π°Ρ‡, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ошибки ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ.
  3. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ: Task прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ настройки Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов выполнСния асинхронной Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.
  4. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимостями: Tasks ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ, Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΈ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ выполнСния Π·Π°Π΄Π°Ρ‡, обСспСчивая ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ порядком выполнСния асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Tasks Π² asyncio:

import asyncio

async def mock_async_operation():
    await asyncio.sleep(2)
    return "Async operation completed"

async def main():
    task = asyncio.create_task(mock_async_operation())
    result = await task
    print("Result:", result)

# Запуск Event Loop ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

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