Na pierwszy rzut oka przetwarzanie równoległe brzmi jak zaproszenie do swobodnego lunchu - możliwość korzystania z procesorów wielordzeniowych bardziej efektywnie podać kod ogromny zwiększenie prędkości. Praktyczne doświadczenie pokazuje, że tak nie zawsze jest: niektóre problemy są niemożliwe do równoległego. Oprócz tego, równoległy wykonanie prowadzi do całej rodziny nowych problemów, które nie są widoczne na maszynach jednorzędowych.
Kod równoległy może zasadniczo podział na dwie grupy pracy. Pierwsza grupa jest klasyczna prędkość wzrostu - jeśli Twój program musi przesiać przez 3000 obrazów, dzielenie pracy oznacza, że więcej zdjęć można przetworzyć w dowolnym momencie. Podczas gdy zdecydowanie korzystny, ten rodzaj zadania rzadko napotkany jest w codziennym rozwoju sieci Web. (Jeśli tworzysz ciężką stronę obrazu, upewnij się, że przywrócisz je z przyzwoitym magazyn w chmurze ).
Bardziej powszechna forma pracy równoległości działa wokół zadań długoterminowych, które nie wymagają dużej ilości czasu procesora. Dobrym przykładem na to będzie czekał na pobieranie lub jakiś rodzaj wejścia urządzenia: jeśli odbywa się to w równoległej modzie, reszta GUI nie musi być zablokowana. Biorąc pod uwagę, że użytkownicy mają tendencję do zrozumienia problemów "Dlaczego przycisk nie kliknie", może to prowadzić do zwiększonej satysfakcji użytkownika, nawet jeśli rzeczywista prędkość nie zwiększa się.
Jeśli potrzebujesz nowych zasobów, aby pomóc Ci kodować mądrzej, sprawdź nasz przewodnik po najlepszych Narzędzia do projektowania stron internetowych. z 2019 r. Jeśli chcesz całkowicie uniknąć kodu, zaprojektuj swoją witrynę najlepiej Kreator strony internetowej i upewnij się, że wybrałeś idealny hosting usługa z naszym przewodnikiem.
var sleep = wymagać ("sen");
Pracownik funkcyjny () {
Console.log ("Pracownik Up")
sleep.msleep (1000)
Console.log ("Pracownik Down")
}
SetInterval (pracownik, 2000);
While (1 == 1)
{
sleep.msleep (250)
Console.log ("Hello z głównego")
} & GT;
Zacznijmy z małym przykładem na podstawie ulubionego ulubionego: setinterval. funkcjonować. Potrzeba odniesienia do funkcji i wartości numerycznej określono w milisekundach. Następnie funkcja jest okresowo zwolniona, gdy wygasa czas opóźnienia.
NPM instaluje sen
NPM Example1.js
Używając sen() Funkcja wymaga od nas załadowania modułu snu do lokalnego projektu NPM. Działa jako interfejs do biblioteki snu systemu operacyjnego - nie zastanawiaj się, czy kompilator stacji roboczej jest zwolniony podczas wdrażania pakietu.
Po uruchomieniu tego programu znajdziesz się skonfrontowany z wyjściem podobnym do tego, który pokazano na rysunku, dołączając do tego kroku. Jest oczywiste, że nasz pracownik nigdy się nie przywołuje - coś musi być nie tak z funkcją SetInterval.
Nowoczesne przeglądarki wyposażają każdą kartę za pomocą jednego wątku javascript. Ostrożnie spojrzenie na naszą pętlę ujawnia, że jest nieograniczona. Oznacza to, że będzie działać na zawsze i nigdy nie udzieli kontroli. Jeśli się uwzględni SetInterval () Działa z wiadomością, jej ładunek nigdy nie zostanie uruchomiony, ponieważ obsługiwacz wiadomości jest zablokowany od uruchomienia.
Const Bar = () = & GT; Console.log ("Bar")
Const Baz = () = & GT; Console.log ("Baz")
const foo = () = & gt; {
Console.log ("foo")
Settimeout (bar, 0)
baz ()
}
bla()
Blog Flavio Cops , zapewnia niezwykle interesujący bit kodu ilustrujący problem. Po uruchomieniu daje wyjście wyświetlane na rysunku z powodu zablokowanego kolejki komunikatów bla() zrezygnuje z kontroli głównego wątku.
Biorąc pod uwagę, że bazowy system operacyjny jest w stanie wykonać prewencyjną wielozadaniowość, pozwól nam wykorzystać swoje możliwości przez tarło nici za pośrednictwem dedykowanych API o nazwie internetowych, które cieszą się szeroko zakrojonym wsparciem. Figura towarzysząca temu krokowi pokazuje aktualna lista dla funkcji.
Console.log ("Pracownik mówi Hello!");
console.log ("pracownik do góry");
While (1 == 1)
{
konsola.log ("x");
}
Webworkers nie mogą się rozpocząć z ładunkiem funkcyjnym. Zamiast tego wymagany jest nowy plik, który zawiera kod przeznaczony do uruchomienia w gwincie. W przypadku naszego przykładu, example7thread.js. Czy przedstawiono treści do tego kroku.
Const pracownik = wymagać ("pracownik_threads");
var myworker = new pracownik.worker ("./
example7thread.js ');
var myworker2 = nowy pracownik.worker ("./
example7thread.js ');
Nasz pracownik jest gotowy na czas podróży. Specjalnościach środowiska wykonawczego Node.js zmuszają nas do włączenia modułu Włókna robotniczego i przejść w ścieżce względnej - problemy nie są skierowane do przeglądarki. Ponadto nie zastanawiaj się nad Brakujący start () Połączenie - pracownik internetowy wyrusza, gdy instancja jest dostępna online.
Dostawa wiadomości zazwyczaj wymaga pewnego rodzaju interakcji między wykonawcą a resztą systemu operacyjnego. Niestety, nasza niekończąca się pętla blokuje ten proces - co oznacza, że tylko jedna z wiadomości pojawia się przed "wielkim stoiskiem".
Const pracownik = wymagać ("pracownik_threads");
var myworker = new pracownik.worker ("./
example7thread.js ');
var myworker2 = nowy pracownik.worker ("./
example7thread.js ');
While (1 == 1)
{
}
Inny eksperyment obejmuje umieszczenie pustej pętli po dwóch inwokacjach konstruktorów. W tym przypadku wątki nigdy nie zaczną działać - komunikat o wywołaniu nigdy nie przybywa do systemu operacyjnego.
Podczas gdy pracownicy prowadzący szczelne niekończące się pętle mają problemy wystawiane powyżej, procedury mogą komunikować się ze sobą. Odbywa się to za pośrednictwem interfejsu przekazywania wiadomości - pomyśl o tym jako obiekt, który pozwala przekazać obiekt wiadomości z nadawcy do odbiorcy przez granice wątków.
Oprócz korzyści płynących z możliwością koordynowania wątków E FF ługowanie (i zmniejszone ryzyko "kolizji", znane również jako warunki wyścigowe), wiadomość przechodząca do głównego wątku jest jedynym sposobem na interakcję z domem, ze względu na Di FF iplerowanie Bezpieczne stosy gui.
Wdrażanie wiadomości przechodzące w węzeł.js jest nużący. Przenieś kod do sieci - Zacznij od utworzenia wiązki HTML, która ładuje się Examplempi.js. . Bądź świadomy, że ten kod może być uruchomiony tylko z serwera WWW LocalHost z powodu ograniczeń pochodzenia Domu.
var myworker = Nowy pracownik ("./
Examplempithread.js ');
var myworker2 = nowy pracownik ("./
Examplempithread.js ');
myworker.onmessage = funkcja (e)
{
konsola.log (e);
}
myworker2.onmessage = funkcja (e)
{
konsola.log (e);
}
Każdy pracownik naraża właściwość Onmessage, która zajmuje funkcję odniesienia, który musi zostać wywołany, gdy pojawi się komunikat z drugiego końca. Wiadomości przychodzące są po prostu przekazywane do konsoli przeglądarki z głównego wątku.
Postmessage ("Pracownik mówi Hello!");
Postmessage ("Pracownik Up");
While (1 == 1)
{
Postmessage ("x");
}
Wysyłanie wiadomości do skrzynki pocztowej jest realizowane przez wywołanie funkcji pocztowej wiadomości. Należy pamiętać, że pracownik może również wdrożyć Onmessage. Wydarzenie, które mogłyby otrzymywać informacje z kogenitu "posiada obiekt instancji pracownika.
W tym momencie, kod jest gotowy do uruchomienia. Konsola deweloperska nie jest zalana wiadomościami ze względu na wysokie poleczność E FF interfejsu MPI, co oznacza, że dane mogą podróżować po systemie E FF icliently.
Dodatek Microsoft asynchroniczny i czeka słowa kluczowe zmodyfikowane historię C # i VisualBasic.net. Zasadniczo metoda oznaczona async jest współpracuje z resztą programu. Wyniki można następnie zbierać za pomocą funkcji oczekiwania.
Const Sleep = (Milliseconds) = & GT; {
zwróć nową obietnicę (rozstrzygnąć = & gt;
Settimeout (postanowienie, milisekund))
}
Biorąc pod uwagę, że przeglądarki są pod ciężkim ograniczeniami, jeśli chodzi o dostęp do natywnych funkcji, nie możemy ponownie wykorzystać funkcji snu wymienionych wcześniej. Ponadto, jest nieoptymalny, ponieważ zatrzymał cały czas wykonania węzła. Fragment towarzyszący temu krokowi zapewnia bardziej skuteczne podejście.
Niniejszy kod zwraca obiekt obietnictwa - jest to kolejna klasa wygody dodana do skryptu Java, próbując ułatwić wielowątkowość. Będziesz musiał wywołać metodę rozwiązania za pośrednictwem settimeout. , zapewniając, że kod musi "usiąść" trochę czasu.
Połączenia wezwania są dozwolone tylko wewnątrz funkcji asynchronizacji. Oznacza to, że pracownik potrzebuje przepisywania - zacznij od wywołania funkcji nacera asynchronizacji. Obsługuje resztę interakcji kodu.
Const Sleep = (Milliseconds) = & GT; {
zwróć nową obietnicę (rozstrzygnąć = & gt;
Settimeout (postanowienie, milisekund))
}
Postmessage ("Pracownik mówi Hello!");
Postmessage ("Pracownik Up");
pracownik()
Async Pracownik funkcji () {
While (1 == 1)
{
Postmessage ("x");
oczekuj snu (1000);
}
}
Deweloperzy pracujący na kodzie Node.js nie powinni zapominać, że mogą - zwykle - tworzyć również całkowicie rodzime moduły, jeśli potrzebna jest niezwykle wysoka wydajność. Mogą one skorzystać z różnych API systemu operacyjnego, ale można również zapisać w językach programowania, które kompilacyjne do kodu maszyny.
Ten artykuł został pierwotnie opublikowany w wydaniu 291 programu Creative Web Design Magazine Projektant stron internetowych . Kup problem 291. .
Czytaj więcej:
(Kredyt obrazu: projekt Blackmagic) W tym artykule zagłębimy się w sztukę komponowania dla 3D. Eksplorowanie tego..
Pentagram stworzył bespoke typefeface dla teatru publicznego (Kredyt obrazu: Pentagram dla publiczności) ..
Przy uwzględnieniu powtarzających się wzorów i wzorów w ilustracji, niewiele narzędzi będzie tak przydatne lub jako potę�..
Kiedy po raz pierwszy odkryłem ProCreee byłem oszołomiony przez pomysł posiadania przenośnego urządzenia, które umożliwi�..
Dla tego Photoshop Tutorial. , Będę tworzyć odtwarzanego człowieka, kobiety Postać z gry wideo ..
Rzeźbianie naprawdę szczegółowego stworzenia 3D może zająć dni - ale nadal jest niesamowite, jak daleko możesz uzyskać za godzinę. Ten model Nubian Ibex został wyrzeźbiony przez ..
Strona 1 z 2: Utwórz tapetę Low Poly w C4D: Kroki 01-06 Utwórz tapetę..