Přejít na hlavní obsah

Asynchronita v Pythonu: principy a příklady práce

  • Marcela Mašek
  • Postupy

Python - je to programovací jazyk, který je široce používán v mnoha oblastech, od vědeckého výzkumu až po vývoj webu. Je známý svou jednoduchostí a snadností použití, nicméně někdy může být výkon a účinnost programů v Pythonu v některých scénářích a aplikacích nedostatečná.

Asynchronní programování - je to technika, která umožňuje maximální využití zdrojů počítače, zejména v prostředí s vysokým zatížením. Umožňuje provádět více operací současně, aniž byste museli očekávat dokončení předchozí operace, což výrazně zvyšuje výkon kódu.

Do Python existuje několik způsobů, jak implementovat asynchronitu. Jedním z nich je použití asynchronní funkce a korutinov. Asynchronní funkce umožňují provádění kódu paralelně, a korutiny umožňují pozastavit a obnovit provádění kódu na vyžádání.

Co je asynchronita?

V kontextu Pythonu se asynchronita stala obzvláště relevantní s příchodem asynchronní knihovny asyncio. Poskytuje výkonné nástroje pro psaní asynchronního kódu, který lze nasadit na velké množství operačních systémů a platforem.

Při použití asynchronity v Pythonu je možné vytvářet koprogramy (coroutines), které mohou být během provádění pozastaveny a obnoveny. To umožňuje provádět několik hovorů funkcí nebo metod paralelně, bez blokování hlavního proudu provádění.

Asynchronní kód v Pythonu je založen na principu event loop (event loop). Je zodpovědný za správu úkolů a jejich provádění v asynchronním prostředí. Když je jedna operace zablokována, cyklus události přepne kontext na jiný úkol, který se provádí paralelně. To zajišťuje optimální využití zdrojů a urychluje dodací lhůty.

Základní principy asynchronity

Základní principy asynchronní práce:

  1. Neblokující operace: asynchronita je možná díky tomu, že operace neblokují výkon celého programu, ale předávají řízení jiným úkolům.
  2. Korutiny: ústředním pojmem v asynchronním programování jsou korutiny – funkce, které mohou pozastavit výkon a předat správu jiným korutinům. To umožňuje efektivní využití zdrojů a vyhnout se blokování.
  3. Event cycle: hlavní složkou asynchronního programu je event cycle, který řídí provádění úkolů a zpracovává události. Sleduje vznik nových operací a mění kontext popravy mezi Korutany.

Asynchronní programování může být obtížnější pro pochopení a ladění, ale umožňuje lepší výkon a odezvu programu. Správné použití asynchronity může výrazně urychlit provádění úkolů a zlepšit uživatelský zážitek.

Asynchronita v Pythonu

Na rozdíl od tradičního synchronního programování, kde jsou úkoly prováděny postupně, asynchronita umožňuje více úkolů najednou. To umožňuje stabilní reakci na různé události a zlepšuje výkon aplikace.

Hlavní součástí asynchronity v Pythonu je koncept corutinu, který umožňuje spouštět funkce, aniž by blokoval hlavní proud provádění. Místo toho se funkce může na určitou dobu "pozastavit" a ustoupit jiným úkolům. Tyto funkce se nazývají asynchronní.

Jednou z hlavních výhod asynchronního programování je možnost efektivního využití zdrojů a zvýšení výkonu aplikace. Asynchronní kód umožňuje minimalizovat prostoje a zlepšuje odezvu systému na externí události.

Asynchronní programování však není univerzálním řešením pro všechny úkoly. To je nejužitečnější v případech, kdy je nutné zpracovat mnoho událostí najednou a je k dispozici dostatek jader procesoru nebo vláken.

Výhody použití asynchronních operací v Pythonu

Jednou z hlavních výhod asynchronních operací je možnost paralelního provádění více úkolů bez blokování hlavního proudu provádění. Díky tomu je dosaženo efektivnějšího využití zdrojů procesoru a paměti RAM.

Asynchronní přístup navíc umožňuje snížit latenci při provádění dlouhých operací, jako jsou databázové dotazy, síťové dotazy nebo výpočty. Namísto čekání na dokončení každé operace mohou asynchronní funkce Přejít na jiné úkoly, zatímco se očekává odpověď.

Další výhodou použití asynchronity je schopnost snadno zpracovat velké množství současných požadavků. Díky korutinovému mechanismu umožňuje Python efektivně pracovat s více zákazníky, což poskytuje nízkou latenci a vysokou šířku pásma.

A konečně, použití asynchronních operací usnadňuje vývoj a podporu softwarového kódu. Asynchronní konstrukce vám umožňují psát kód stručněji a srozumitelněji, čímž se vyhnete nadměrné složitosti a duplicitě kódu.

Všechny tyto výhody dělají z asynchronních operací důležitý nástroj, který může zlepšit výkon a efektivitu aplikací Python.

Příklady práce s asynchronními funkcemi

Asynchronní funkce v Pythonu vám umožní provádět více úkolů najednou, což zvyšuje výkon aplikace. Podívejme se na několik příkladů práce s asynchronními funkcemi.

Příklad 1: Spuštění několika úkolů paralelně.

import asyncioasync def task1():await asyncio.sleep(1)print("Задача 1 выполнена")async def task2():await asyncio.sleep(2)print("Задача 2 выполнена")async def main():await asyncio.gather(task1(), task2())asyncio.run(main())

V tomto příkladu vytváříme dvě asynchronní funkce, task1 () a task2 (), které se provádějí paralelně pomocí funkce asyncio.gather(). Úkol 1 je dokončen během 1 sekundy a úkol 2 je 2 sekundy. Výsledek provedení:

Задача 1 выполненаЗадача 2 выполнена

Příklad 2: Úkoly s očekáváním výsledku.

import asyncioimport randomasync def get_data():await asyncio.sleep(2)return random.randint(1, 10)async def process_data():data = await get_data()await asyncio.sleep(1)print(f"Обработано число: ")async def main():await process_data()asyncio.run(main())

V tomto příkladu vytváříme asynchronní funkci get_data (), která vrací náhodné číslo po zpoždění 2 sekund. Toto číslo se pak přenese do funkce process_data (), která má také zpoždění 1 sekundy. Výsledek provedení:

Обработано число: [рандомное число]

Tyto příklady ukazují jednoduché principy práce s asynchronními funkcemi v Pythonu. Je důležité umět správně používat asynchronitu k optimalizaci procesů a zvýšení výkonu aplikací.

Příklad 1: asynchronní stahování souborů

K vyřešení tohoto problému lze použít asynchronní programování v Pythonu. Jedním z nejoblíbenějších přístupů je použití knihovny aiohttp, která umožňuje provádět požadavky na externí zdroje paralelně.

Níže je uveden příklad kódu, který ukazuje asynchronní stahování souborů pomocí aiohttp:

import asyncio import aiohttp async def download_file(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: data = await response.read () # uložení souboru na disk nebo další zpracování async def main (): URL = [ 'https://example.com/file1.txt', 'https://example.com/file2.txt', 'https://example.com/file3.txt', ] tasks = [] for url in urls: tasks.append(asyncio.create_task(download_file(url))) await asyncio.gather(*tasks) asyncio.run(main())

V tomto příkladu funkce download_file provádí asynchronní stahování souboru z dané adresy URL. Funkce main iniciuje asynchronní provádění více úkolů download_file pomocí knihovny asyncio.

Ke spuštění aplikace se používá funkce asyncio.run (main ()), který spouští cyklus událostí a čeká na dokončení všech asynchronních úkolů.

Tento přístup umožňuje souběžné stahování souborů a zkracuje dobu odezvy aplikace. Asynchronita v Pythonu navíc umožňuje spravovat další úkoly při provádění dotazů, což může být užitečné například pro práci s uživatelským rozhraním nebo provádění jiných asynchronních operací.

Výhody asynchronního stahování souborů:

  • Zvýšení výkonu aplikace
  • Zkrácení doby odezvy
  • Možnost paralelního stahování více souborů
  • Správa ostatních úkolů během provádění dotazů

Příklad 2: asynchronní web scraping

Pro příklad zvažte skript, ve kterém je třeba shromáždit informace o titulcích a obsahu více webových stránek pomocí asynchronních dotazů. Za tímto účelem vytvoříme funkci get_data, která bude zpracovávat každou stránku:

ZáhlavíObsah
Titulek 1Obsah 1
Titulek 2Obsah 2
Titulek 3Obsah 3

Pomocí knihovny aiohttp můžeme odeslat asynchronní požadavky na každou stránku, získat výsledek a zpracovat jej. Kód může vypadat následovně:

import aiohttpimport asyncioasync def get_data(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:data = await response.text()# обработка данныхurls = ['https://example.com/page1','https://example.com/page2','https://example.com/page3']loop = asyncio.get_event_loop()tasks = [get_data(url) for url in urls]loop.run_until_complete(asyncio.gather(*tasks))

V tomto příkladu vytvoříme seznam adres URL, na které budeme odesílat dotazy. Poté vytvoříme cyklus událostí asyncio a seznam úkolů, kde každý úkol představuje výzvu funkce get_data s přenosem adresy URL jako argumentem. Poté spustíme cyklus událostí před dokončením všech úkolů pomocí volání funkce run_until_complete a nástroje gather .

Tento asynchronní přístup umožňuje zkrátit dobu provádění operací sběru dat, protože webové dotazy jsou prováděny paralelně, nikoli důsledně. To je zvláště užitečné při práci s více webovými stránkami nebo v případě potřeby shromažďování dat z webových stránek, které mohou nějakou dobu trvat.