Підбірка відео по конкурентності:
Асинхронний Пайтон за 5 хвилин / Python - AsyncIO
Введення у Асинхронне Програмування - Процеси, Потоки, GIL та Asyncio
Основи роботи з Процесами та Потоками у Пайтоні
#asyncio
Асинхронний Пайтон за 5 хвилин / Python - AsyncIO
Введення у Асинхронне Програмування - Процеси, Потоки, GIL та Asyncio
Основи роботи з Процесами та Потоками у Пайтоні
#asyncio
YouTube
Асинхронний Пайтон за 5 хвилин / Python - AsyncIO
Чи можливо розібратись в Асинхронному Пайтоні за 5 хвилин?
Дивись це відео, і переконайся в цьому сам, це не займе в тебе багато часу.
Підтримати канал:
Patreon: https://patreon.com/python_decoded
Посилання на Банку: https://send.monobank.ua/jar/3CiHEjphUu…
Дивись це відео, і переконайся в цьому сам, це не займе в тебе багато часу.
Підтримати канал:
Patreon: https://patreon.com/python_decoded
Посилання на Банку: https://send.monobank.ua/jar/3CiHEjphUu…
❤1😭1
Python Materials For Beginners
Підбірка відео по конкурентності: Асинхронний Пайтон за 5 хвилин / Python - AsyncIO Введення у Асинхронне Програмування - Процеси, Потоки, GIL та Asyncio Основи роботи з Процесами та Потоками у Пайтоні #asyncio
На жаль в багатьох відео пояснення асинхронки у python якесь не дуже (у тому числі у відео що я привів вище). Чомусь багато авторів лізуть під капот діставати генератори, які не дуже й то пояснюють основну суть.
На мою думку варто більше акцентувати свою увагу на розумінні IO-bound та CPU-bound задачах.
Також важливі моменти asyncio.gather та asyncio.wait, asyncio.wait_for які як раз дають змогу
отримувати виграш у часі виконання програми за рахунок IO-bound.
#asyncio
На мою думку варто більше акцентувати свою увагу на розумінні IO-bound та CPU-bound задачах.
Також важливі моменти asyncio.gather та asyncio.wait, asyncio.wait_for які як раз дають змогу
отримувати виграш у часі виконання програми за рахунок IO-bound.
#asyncio
I/O-bound задача (Input/Output bound — задача, обмежена вводом-виводом) — це тип задач у програмуванні, під час виконання яких процесор більшість часу простоює в очікуванні, поки завершиться зовнішня операція.
У таких задачах швидкість виконання програми залежить не від потужності процесора (CPU), а від швидкості зовнішніх систем чи пристроїв.
До I/O-bound можна віднести:
1. Роботу з мережею (у тому числі HTTP-запити та роботу з БД).
2. Роботу з пристроями (наприклад, роботу через serial port).
3. Роботу з файлами.
Операційна система надає спеціальний набір функцій для асинхронної роботи, які зазвичай називають неблокуючими (non-blocking). Python будує над ними свою обгортку яка підтримує синтаксис async/await
#asyncio
У таких задачах швидкість виконання програми залежить не від потужності процесора (CPU), а від швидкості зовнішніх систем чи пристроїв.
До I/O-bound можна віднести:
1. Роботу з мережею (у тому числі HTTP-запити та роботу з БД).
2. Роботу з пристроями (наприклад, роботу через serial port).
3. Роботу з файлами.
Операційна система надає спеціальний набір функцій для асинхронної роботи, які зазвичай називають неблокуючими (non-blocking). Python будує над ними свою обгортку яка підтримує синтаксис async/await
#asyncio
Бібліотеки httpx і curl_cffi (на відміну від requests) надають як синхроний так і асинхронний інтерфейси:
За виключенням синтаксису async/await і запуску через
І що варто підкреслити не має виграшу у часі виконання.
Обидва приклади відправляють HTTP запит на сервер, а потім чекають від нього відповіді.
#asyncio
import httpx
def main():
with httpx.Client() as client:
response = client.get("https://httpbin.org/get")
print(response.status_code)
main()
import asyncio
import httpx
async def main():
async with httpx.AsyncClient() as client:
response = await client.get("https://httpbin.org/get")
print(response.status_code)
asyncio.run(main())
За виключенням синтаксису async/await і запуску через
asyncio.run різниці немає.І що варто підкреслити не має виграшу у часі виконання.
Обидва приклади відправляють HTTP запит на сервер, а потім чекають від нього відповіді.
#asyncio
👍1
Виграшу у часі виконання.
За рахунок неблокуючих операцій ми можемо відправити запит на сервер, але не чекати відповіді - робити іншу задачу.
#asyncio #create_task
За рахунок неблокуючих операцій ми можемо відправити запит на сервер, але не чекати відповіді - робити іншу задачу.
async with httpx.AsyncClient() as client:
task = asyncio.create_task(
client.get("https://example.com/")
)
# поки запит обробляється, ми
# не чекаємо відповіді, а робимо іншу задачу
# наприклад інший запит або якісь обчислення
# тут пізніше отримуємо відповідь
response = await task
print(response.status_code)
#asyncio #create_task
Виграш у часі виконання за рахунок одночасного очікування відповідей.
Вивід:
API
Якби ми робили запити послідовно, час виконання становив би 1 + 3 + 2 = ~6 с. Проте завдяки асинхронності ми досягли результату ~3,3 с, що співмірне з часом найдовшого запиту.
#asyncio #gather
asyncio.gatherimport time
import asyncio
import httpx
# Ключ від безкоштовного апі https://app.reqres.in
API_KEY = "free_user_****************"
async def main():
async with httpx.AsyncClient() as client:
client.headers["x-api-key"] = API_KEY
start = time.monotonic()
responses = await asyncio.gather(
client.get("https://reqres.in/api/users?delay=1"), # запит 1с
client.get("https://reqres.in/api/users?delay=3"), # запит 3с
client.get("https://reqres.in/api/users?delay=2"), # запит 2с
)
print(f"Elapsed: {time.monotonic() - start:.2f} s")
print("Status codes: ", [r.status_code for r in responses])
if __name__ == "__main__":
asyncio.run(main())
Вивід:
Elapsed: 3.30 s
Status codes: [200, 200, 200]
API
app.reqres.in дозволяє задати час відповіді для кожного запиту (1, 3 та 2 с). Це дає можливість побачити перевагу асинхронності, коли запити виконуються групою й відповіді очікуються одночасно.Якби ми робили запити послідовно, час виконання становив би 1 + 3 + 2 = ~6 с. Проте завдяки асинхронності ми досягли результату ~3,3 с, що співмірне з часом найдовшого запиту.
#asyncio #gather
❤2