Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 6958|Odpoveď: 1

Multithreading dostáva škálovateľnosť do slepej uličky

[Kopírovať odkaz]
Zverejnené 6. 12. 2014 22:21:58 | | |
Toto je článok zo sveta Pythonu, ale stále je použiteľný pre celé programovanie, hoci multithreading nám umožňuje rýchlejšie spracovávať požiadavky, ale existuje aj strop, zelené (mikrovláknové) vlákna sú riešením.

Vývoj viacvláknového softvéru rieši veľké množstvo problémov, najmä pre aplikácie zamerané na sieť, ktoré vyžadujú náročný výkon, aby rýchlo reagovali na používateľov. Bohužiaľ, multithreading nestačí na vyriešenie veľkorozmerných problémovSúbežnosťsexuálne problémy.

Riešenie týchto problémov si vyžaduje zmenu programovacích modelov, využívanie asynchrónnych udalostí a mechanizmov založených na spätnom volaní. V Druva sme vytvorili python knižnicu s názvom Dhaga na riešenie veľkorozmerných problémovSúbežnosť, zatiaľ čo programovací model nevyžaduje významné zmeny.

Softvéroví vývojári žijú v jednejSúbežnosťsvet. Vlákna sú dnes prvotriednymi občanmi, najmä počas vývoja, najmä keď vaša aplikácia vykonáva intenzívne sieťové operácie, ako je systém inSync (produkt na synchronizáciu sieťovej bezpečnosti) ako Druva. Multithreading pomáha plynulosti programovacieho kódu pre sieťové operácie jednoduchým a usporiadaným. Keď naša aplikácia potrebuje zlepšenie alebo zlepšenie výkonu, dá sa zlepšiťElasticita, môžeme zvýšiť počet vlákien.

Ale pokiaľ ide o tisíce mierokSúbežnosťŽiadosti, vlákna nestačia.

Zistili sme, že multithreading má nasledujúce nevýhody:
1. Systémový klient inSync musí zálohovať veľké množstvo súborov na server prostredníctvom sieťových RPC volaní. Typický spôsob, ako vývojári zrýchľujú prácu, je použitie vlákien. Avšak výkon poskytovaný viacvláknovým spracovaním zvyšuje náklady na pamäť a procesor; Vývojári musia udržiavať rovnováhu medzi rýchlosťou a počtom vlákien.

2. Naše servery musia zvládnuť systém inSync a tisíce zákazníkovSúbežnosťPripojenia a notifikácie. Na efektívne spracovanie spojení používame vlákna na spracovanie požiadaviek. Ale rastúci počet zákazníkov systému inSync tiež znamená, že musíme neustále zvyšovať počet vlákien, čo spotrebováva veľa serverovej pamäte a CPU.

3. Náš webový server musí spracovať tisíce paralelných HTTP požiadaviek. Väčšina práce je na sieťových socketoch, ktoré prijímajú a odosielajú dáta a posielajú ich na backend systému inSync. Spôsobuje, že väčšina vlákien čaká na sieťové operácie. Problém C10K spôsobuje, že keď sú tisíce synchronných požiadaviek na webový server, generovanie vlákna pre každú požiadavku je pomerne neškálovateľné (Scale).

Obmedzenia asynchrónnych rámcov
Mnohé asynchrónne frameworky, vrátane Twisted, Tornado Tornado a asyncore, môžu vývojárom pomôcť vzdialiť sa od populárnych spôsobov používania vlákien. Tieto rámce sa spoliehajú na neblokujúce sockety a mechanizmy spätného volania (podobne ako Node.js). Ak použijeme tieto frameworky tak, ako sú, hlavné časti nášho Druva kódu budú musieť byť refaktorované. To nie je to, čo chceme robiť. Refaktorovanie kódu predlžuje vývojové a testovacie cykly, čím nám bráni splniť naše požiadavky na škálovanie. Keďže viaceré časti produktu musia byť masívne, každý z nás ich bude musieť refaktorovať – preto sa snažíme zdvojnásobiť alebo strojnásobiť.

Aby sme sa vyhli množstvu zmien kódu, museli sme sa vzdialiť od priameho používania existujúceho frameworku. Našťastie sme našli niekoľko užitočných nástrojov.

Keďže chceme riadiť vykonávanie kódu na sieťovom I/O, potrebujeme spôsob, ako rozdeliť vlákno na mikrovlákna. ZistímeGreenlets。 Poskytuje neimplicitné mikrovláknové plánovanie nazývané korutina ko-rutiny. Inými slovami. Je to užitočné, keď chcete kontrolovať, ako váš kód beží. Môžete vytvárať mikrovlákna pre vlastné harmonogramy, pretože môžete ovládať, kedy greenlety spôsobujú pauzy. To je pre nás ideálne, pretože nám to dáva plnú kontrolu nad plánovaním nášho kódu.

Tornado je jednoduchý, neblokujúci webový serverový framework napísaný v Pythone, navrhnutý na spracovanie tisícok asynchrónnych požiadaviek. Používame jeho základný komponent, IOLoop IOStream. IOLoop je neblokujúca socketová I/O eventová slučka; Používa epoll (na Linuxe) alebo fronty (BSD a Mac OS X), inak vyberie (na Windows), ak sú dostupné. IOStream poskytuje neblokujúce sockety, ako je pohodlné balenie na čítanie a zápis. Všetky operácie so socketom delegujeme na Tornado a potom používame callbacky na spustenie kódových operácií na dokončenie (poznámka banq: veľmi podobné Node.js mechanizmu).

Je to dobrý začiatok, ale potrebujeme viac. Ak použijeme vyššie uvedený modul priamo v našom kóde, veľa z nášho RPC kódu sa bude musieť zmeniť, plánovať RPC cez greenlety, zabezpečiť, aby greenlety neblokovali (ak sa greenlety zablokujú, zablokuje to celé vlákno a všetky ostatné), riešiť callback funkcie z Tornado.

Potrebujeme abstrakciu na správu a usporiadanie greenletov, aby sme ich nezahlcovali externými volaniami, a táto abstrakcia môže byť masívne škálovateľná aj mimo vlákien. Táto abstrakcia je Dhaga, ktorá umožňuje programovať tok aplikačného kódu ako tradičnú synchronnú sekvenciu, ale vykonávanie je asynchrónne.

Dhaga (z hindčiny, čo znamená vlákno) je rámec pre vykonávanie ľahkého vlákna, ktoré abstrahujeme. Trieda Dhaga je odvodená od greenlets a používa prepínanie zásobníka na vykonávanie viacerých kódových tokov v jednom vlákne operačného systému. Vlákna jedného operačného systému vykonávajú viacero dhagas pomocou kolaboratívneho plánovania. Kedykoľvek dhaga čaká (hlavne čaká na návrat RPC volania), odovzdáva kontrolu rodičovskej úrovni (t. j. kontextu vykonávania vlákna na úrovni operačného systému, ktoré ju vytvorilo). Rodičovská úroveň potom naplánuje ďalšiu dhagu, aby bola pripravená na spustenie. Volanie RPC bude odoslané na webový server Tornado, aby zapísal socket asynchrónne, a potom zaregistruje spätné volanie, keď sa vráti, čakajúci dhaga bude pridaný do fronty spustiteľného súboru a následne prevezme rodičovské vlákno. (Poznámka Banq: podobné node.js princípu)

Dhaga môžeme použiť namiesto vlákien pre operácie s vysokou latenciou a používame 512 dhaga v jednom vlákne, keď počet vlákien prekročí rozumný limit pre priepustnosť.







Predchádzajúci:Vzor rámca MVC je mŕtvy
Budúci:Výhody a nevýhody MVC rámcov:
Zverejnené 7. 12. 2014 17:22:55 |
Čítať a prispievať späť je cnosť
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com