[python] asynchronni programovani, stavovy stroj
superman
feed na centrum.cz
Sobota Srpen 2 14:02:06 CEST 2008
>
> A vas se ptam - prehlednul jsem neco, co by cely proces zjednodusilo,
> doporucili byste mi neco jineho nebo mate zkusenosti s navrhem
> asynchronnich procesu?
>
Ano, přehlédnul. Tento problém se řeší velmi často, a je na něj krásné
standardizované řešení. To řešení spočívá v tom, že se určí maximální
počet běžících threadů - řekněme třeba 50. Pak se vytvoří tzv. thread
pool, tedy objekt, který spustí 50 threadů a drží je v pozastaveném
stavu. Všechny potřebné úkoly se řadí do fronty operací, které pak
přebírá thread pool a přiřazuje jim jednotlivé thready. Tedy pokud je
potřebných operací méně, než max. počet threadů, některé thready spí a
zbylé vykonávají operace. Pokud je operací více, než threadů, pak
všechny thready vykonávají operace až do max. počtu, tedy v tomto
případě do 50 a zbylé čekají ve frontě. Jakmile jakákoli operace skončí,
volný thread vybere z fronty další operaci a začne jí vykonávat.
Tímto dosáhnete max. rychlosti a vysokého výkonu. Za prvé se zbavíte
režie vytváření a rušení threadu - všech 50 threadů vytvoříte najednou a
stále existují v thread poolu. Za druhé - příliš velký počet threadů
naráz je neefektivní a režie operačního systémů při přepínání kontextu
obrovského množství threadů sežere značnou část výkonu. Takže při
rozumně zvoleném počtu threadů probíhají operace nejrychlejší možnou
rychlostí - vyšší, než kdyby bylo threadů méně, nebo více. Za třetí -
snažší synchronizace thread díky tomu, že je máte najednou pod kontrolou
v jednom objektu - synchronizační akce bývají výrazně zjednodušeny.
Psal bych víc, ale pro základní představu to stačí.
Miloslav Ponkrác
Další informace o konferenci Python