Jaka jest różnica między wykonywaniem asynchronicznym i synchronicznym?
Jaka jest różnica między wykonywaniem asynchronicznym i synchronicznym?
Odpowiedzi:
Kiedy wykonujesz coś synchronicznie, czekasz na jego zakończenie, zanim przejdziesz do innego zadania. Gdy wykonujesz coś asynchronicznie, możesz przejść do innego zadania przed jego zakończeniem.
Biorąc to pod uwagę, w kontekście komputerów przekłada się to na wykonanie procesu lub zadania w innym „wątku”. Wątek to seria poleceń (blok kodu), która istnieje jako jednostka pracy. System operacyjny może zarządzać wieloma wątkami i przypisywać wątkowi kawałek („plaster”) czasu procesora przed przełączeniem na inny wątek, aby dać mu kolejną pracę. U podstaw (przepraszam za kalambur) procesor może po prostu wykonać polecenie, nie ma pojęcia o robieniu dwóch rzeczy jednocześnie. System operacyjny symuluje to, przydzielając przedziały czasu do różnych wątków.
Teraz, jeśli wprowadzisz wiele rdzeni / procesorów do miksu, wtedy rzeczy MOGĄ się wydarzyć jednocześnie. System operacyjny może przydzielić czas do jednego wątku na pierwszym procesorze, a następnie przydzielić ten sam blok czasu do innego wątku na innym procesorze. Wszystko to polega na umożliwieniu systemowi zarządzającemu ukończeniem zadania, podczas gdy ty możesz kontynuować pracę w kodzie i robić inne rzeczy.
Programowanie asynchroniczne jest skomplikowanym tematem ze względu na semantykę tego, jak rzeczy wiążą się ze sobą, gdy można je wykonywać jednocześnie. Istnieje wiele artykułów i książek na ten temat; Spójrz!
Synchroniczny / asynchroniczny NIE MA NIC ZROBIĆ Z WIELOMIOTEM.
Synchroniczny lub zsynchronizowany oznacza w jakiś sposób „połączony” lub „zależny”. Innymi słowy, dwa zadania synchroniczne muszą być świadome siebie nawzajem, a jedno zadanie musi zostać wykonane w sposób zależny od drugiego, na przykład poczekać, aż uruchomi się drugie zadanie.
Asynchroniczne oznacza, że są całkowicie niezależne i żadne z nich nie może brać pod uwagę w żaden inny sposób, ani w trakcie inicjacji, ani w wykonaniu.
Synchroniczny (jeden wątek):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Synchroniczny (wielowątkowy):
thread A -> |<---A---->|
\
thread B ------------> ->|<----B---------->|
\
thread C ----------------------------------> ->|<------C----->|
Asynchroniczny (jeden wątek):
A-Start ------------------------------------------ A-End
| B-Start -----------------------------------------|--- B-End
| | C-Start ------------------- C-End | |
| | | | | |
V V V V V V
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->|
Asynchroniczny (wielowątkowy):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
<
, >
znaków.|
Technicznie koncepcja synchroniczna / asynchroniczna tak naprawdę nie ma nic wspólnego z wątkami . Chociaż ogólnie rzecz biorąc, niezwykłe jest znajdowanie zadań asynchronicznych działających w tym samym wątku, możliwe jest (patrz przykłady poniżej) i często zdarza się, że dwa lub więcej zadań wykonuje się synchronicznie w osobnych wątkach ... Nie, koncepcja Synchroniczny / asynchroniczny musi dotyczyć wyłącznie tego, czy drugie lub kolejne zadanie może zostać zainicjowane przed zakończeniem drugiego (pierwszego) zadania, czy też musi czekać. To wszystko. Jaki wątek (lub wątki), procesy lub procesory, a nawet sprzęt, na którym zadania są wykonywane, nie jest istotny. Rzeczywiście, aby to podkreślić, edytowałem grafikę, aby to pokazać.
PRZYKŁAD ASYNCHRONICZNY:
Przy rozwiązywaniu wielu problemów inżynierskich oprogramowanie ma na celu podzielenie ogólnego problemu na wiele indywidualnych zadań, a następnie wykonanie ich asynchronicznie. Dobrym przykładem jest odwrócenie macierzy lub problem analizy elementów skończonych. W informatyce sortowanie listy jest przykładem. Na przykład procedura quicksort dzieli listę na dwie listy i wykonuje szybkie sortowanie na każdej z nich, nazywając się rekurencyjnie (quicksort). W obu powyższych przykładach dwa zadania mogą (i często były) wykonywane asynchronicznie. Nie muszą znajdować się w osobnych wątkach. Nawet maszynę z jednym procesorem i tylko jednym wątkiem wykonania można zakodować w celu zainicjowania przetwarzania drugiego zadania przed zakończeniem pierwszego. Jedynym kryterium jest to, że wyniki jednego zadania nie są konieczne jako dane wejściowe do drugiego zadania. Tak długo, jak czasy rozpoczęcia i zakończenia zadań nakładają się (możliwe tylko, jeśli wynik żadnego z nich nie jest potrzebny jako dane wejściowe do drugiego), są one wykonywane asynchronicznie, bez względu na liczbę używanych wątków.
PRZYKŁAD SYNCHRONICZNY:
Każdy proces składający się z wielu zadań, w którym zadania muszą być wykonywane po kolei, ale jedno musi być wykonane na innym komputerze (Pobierz i / lub zaktualizuj dane, uzyskaj wycenę akcji z usługi finansowej itp.). Jeśli znajduje się na osobnej maszynie, znajduje się w osobnym wątku, zarówno synchronicznym, jak i asynchronicznym.
Mówiąc prościej:
SYNCHRONICZNY
Jesteś w kolejce po bilet do kina. Nie możesz dostać jednego, dopóki wszyscy przed tobą nie dostaną, to samo dotyczy osób w kolejce za tobą.
ASYNCHRONICZNY
Jesteś w restauracji z wieloma innymi ludźmi. Zamawiasz swoje jedzenie. Inne osoby mogą również zamówić jedzenie, nie muszą czekać, aż zostanie ono ugotowane i podane, zanim będą mogły zamówić. W kuchni pracownicy restauracji stale gotują, serwują i przyjmują zamówienia. Ludzie dostaną swoje jedzenie, gdy tylko zostanie ugotowane.
Wykonanie synchroniczne
Mój szef jest zajęty. Mówi mi, żebym napisał kod. Mówię mu: w porządku. Zaczynam, a on obserwuje mnie jak sępa, stojącego za mną, z ramienia. Jestem jak „Koleś, WTF: dlaczego nie pójdziesz i nie zrobisz czegoś, dopóki to skończę?”
on mówi: „Nie, czekam tutaj, aż skończycie”. To jest synchroniczne.
Wykonanie asynchroniczne
Szef każe mi to zrobić i zamiast czekać tam na moją pracę, szef odchodzi i wykonuje inne zadania. Kiedy kończę pracę, po prostu zgłaszam się do szefa i mówię: „Skończono!” To jest wykonanie asynchroniczne.
(Posłuchaj mojej rady: NIGDY nie pracuj z szefem za tobą.)
Wykonanie synchroniczne oznacza, że wykonanie odbywa się w jednej serii. A->B->C->D
. Jeśli wywołujesz te procedury, A
uruchomi się, a następnie zakończy, następnie B
uruchomi, a następnie zakończy, C
uruchomi itp.
W przypadku wykonywania asynchronicznego uruchamiasz procedurę i pozwól jej działać w tle podczas uruchamiania następnego, a następnie w pewnym momencie powiedz „poczekaj, aż to się skończy”. To bardziej jak:
Rozpocznij A->B->C->D->
Zaczekaj na A
zakończenie
Zaletą jest to, że można wykonać B
, C
i czy D
podczas A
nadal działa (w tle, w osobnym wątku), dzięki czemu można lepiej wykorzystać swoje zasoby i mają mniej „zawiesza się” lub „czeka”.
W skrócie, synchronizacja odnosi się do dwóch lub więcej punktów początkowych i końcowych procesów, a NIE ich wykonywania . W tym przykładzie punkt końcowy procesu A jest zsynchronizowany z punktem początkowym procesu B:
SYNCHRONICZNY | -------- A -------- | | -------- B -------- |
Z drugiej strony procesy asynchroniczne nie mają zsynchronizowanych punktów początkowych i końcowych:
ASYNCHRONICZNY | -------- A -------- | | -------- B -------- |
Tam, gdzie Proces A nakłada się na Proces B, działają one jednocześnie lub synchronicznie (definicja słownikowa), stąd zamieszanie.
AKTUALIZACJA: Charles Bretana poprawił swoją odpowiedź , więc ta odpowiedź jest teraz prostym (potencjalnie nadmiernie uproszczonym) mnemonikiem.
Synchroniczny oznacza, że dzwoniący czeka na odpowiedź lub zakończenie, asynchronicznie, że dzwoniący kontynuuje, a odpowiedź przychodzi później (jeśli dotyczy).
Jako przykład:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
To zawsze będzie generować:
Before call
In call
After call
Ale jeśli mielibyśmy uczynić doSomething asynchronicznym (wiele sposobów, aby to zrobić), to wynik mógłby wyglądać następująco:
Before call
After call
In call
Ponieważ metoda wykonująca wywołanie asynchroniczne natychmiast kontynuowałaby z następnym wierszem kodu. Mówię „mógł”, ponieważ nie można zagwarantować kolejności wykonywania operacji asynchronicznych. Może również działać jako oryginał, w zależności od czasów wątków itp.
Myślę, że jest to trochę ogólne wyjaśnienie, ale nadal wyjaśnia ono na przykładzie z prawdziwego życia.
Mały przykład:
Powiedzmy, że odtwarzanie dźwięku obejmuje trzy kroki:
Jeśli odtwarzacz audio wykonuje kolejno kroki 1,2,3 dla każdego utworu, jest on synchroniczny. Będziesz musiał poczekać chwilę, aby usłyszeć piosenkę, aż piosenka zostanie rzeczywiście ściągnięta i zdekompresowana.
Jeśli Twój odtwarzacz audio wykonuje kroki 1,2,3 niezależnie od siebie, jest asynchroniczny. to znaczy. Podczas odtwarzania dźwięku 1 (krok 3), jeśli równolegle pobiera dźwięk 3 z dysku twardego (krok 1) i równolegle dekompresuje dźwięk 2. (krok 2) Skończysz na słuchaniu piosenki bez czekania na pobranie i dekompresję.
Operacje synchronizacji i asynchronizacji dotyczą wykonania zlecenia nowego zadania w stosunku do bieżącego zadania. Dwa zadania na stole: bieżące i nowe zadanie
Synchroniczny (blokowanie) - oznacza, że zadania będą wykonywane jeden po drugim. Następne zadanie jest uruchamiane dopiero po zakończeniu poprzedniego zadania. Task 2
nie jest uruchamiany do momentu Task 1
zakończenia
Asynchroniczny (nieblokujący) - oznacza, że zadanie natychmiast zwraca kontrolę z obietnicą wykonania kodu i powiadomienia o wyniku później (np. Wywołanie zwrotne, funkcja). Task 2
jest wykonywany, nawet jeśli Task 1
nie jest ukończony
TAK odpowiedź na temat synchronizacji i asynchronizacji: w systemie iOS , w systemie Android
Mówiąc wprost, wykonywanie asynchroniczne robi rzeczy w tle.
Na przykład, jeśli chcesz pobrać plik z Internetu, możesz użyć do tego celu funkcji synchronicznej, ale zablokuje on wątek do momentu zakończenia pobierania pliku. Może to spowodować, że aplikacja nie będzie reagować na dane wprowadzane przez użytkownika.
Zamiast tego możesz pobrać plik w tle za pomocą metody asynchronicznej. W takim przypadku funkcja pobierania natychmiast wraca, a wykonywanie programu przebiega normalnie. Wszystkie operacje pobierania są wykonywane w tle, a Twój program zostanie powiadomiony o zakończeniu.
Jako bardzo prosty przykład
SYNCHRONICZNY
Wyobraź sobie 3 uczniów, którzy zostali poproszeni o przeprowadzenie sztafety na drodze.
Pierwszy uczeń przebiega podaną odległość, zatrzymuje się i podaje pałeczkę drugiemu. Nikt inny nie zaczął działać.
1------>
2.
3.
Kiedy drugi uczeń odzyskuje pałeczkę, zaczyna biec na dany dystans.
1.
2------>
3.
Druga studentka rozwiązała sznurowadło. Teraz przestała i znów się wiązała. Z tego powodu czas zakończenia drugiego wydłużył się, a czas rozpoczęcia trzeciego został opóźniony.
1.
--2.--->
3.
Ten wzór trwa do momentu, aż 3. odzyska pałeczkę z 2. miejsca i ukończy wyścig.
ASYNCHRONICZNY
Wyobraź sobie 10 przypadkowych osób idących tą samą drogą. Oczywiście nie stoją w kolejce, po prostu chodzą w różnych miejscach na drodze w różnym tempie.
Sznurowadło drugiej osoby rozwiązało się. Zatrzymała się, żeby znów ją związać.
Ale nikt nie czeka na to, żeby ją związała. Wszyscy inni wciąż chodzą tak samo, jak wcześniej, w tym samym tempie.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
Stworzyłem gif dla wyjaśnienia tego, mam nadzieję, że będzie pomocny: spójrz, linia 3 jest asynchroniczna, a inne są synchroniczne. wszystkie linie przed linią 3 powinny poczekać, aż linia zakończy pracę, ale ponieważ linia 3 jest asynchroniczna, następna linia (linia 4), nie czekaj na linię 3, ale linia 5 powinna poczekać, aż linia 4 zakończy pracę, a linia 6 powinna czekać na linię 5 i 7 na 6, ponieważ linie 4,5,6,7 nie są asynchroniczne.
Podczas wykonywania sekwencji takiej jak: a> b> c> d>, jeśli otrzymamy błąd w trakcie wykonywania, taki jak:
a
b
c
fail
Następnie zaczynamy od nowa:
a
b
c
d
to jest synchroniczne
Jeśli jednak mamy tę samą sekwencję do wykonania: a> b> c> d>, aw środku mamy błąd:
a
b
c
fail
... ale zamiast restartować od początku, restartujemy od momentu awarii:
c
d
... to jest asynchroniczne.
Mylisz Synchroniczny z Parallel vs Series. Synchroniczny oznacza wszystko w tym samym czasie. Zsynchronizowane środki odnoszące się do każdej innej dziedziny, które mogą oznaczać szeregowo lub w ustalonych odstępach czasu. Podczas gdy program robi wszystko, działa szeregowo. Zdobądź słownik ... dlatego mamy niesłodzoną herbatę. Masz herbatę lub słodzoną herbatę.
Synchroniczny oznacza w zasadzie, że możesz wykonać tylko jedną rzecz naraz. Asynchroniczny oznacza, że możesz wykonywać wiele rzeczy na raz i nie musisz kończyć wykonywania bieżącej rzeczy, aby przejść do następnej.
Skorzystaj z przykładu instrukcji przygotowania śniadania
Jeśli masz doświadczenie w gotowaniu, wykonaj te instrukcje asynchronicznie. zaczniesz rozgrzewać patelnię na jajka, a potem zacznij bekon. Włożyłeś chleb do tostera, a potem zacząłeś jajka. Na każdym etapie procesu zaczynasz zadanie, a następnie skupiasz się na zadaniach gotowych.
Gotowanie śniadania jest dobrym przykładem pracy asynchronicznej, która nie jest równoległa. Jedna osoba (lub wątek) może obsłużyć wszystkie te zadania. Kontynuując analogię śniadania, jedna osoba może zrobić śniadanie asynchronicznie, rozpoczynając następne zadanie przed ukończeniem pierwszego. Gotowanie przebiega niezależnie od tego, czy ktoś go ogląda. Gdy tylko zaczniesz rozgrzewać patelnię na jajka, możesz zacząć smażyć boczek. Gdy bekon się zacznie, możesz włożyć chleb do tostera.
W przypadku algorytmu równoległego potrzebujesz wielu kucharzy (lub wątków). Zrobiłoby się jajka, jeden bekon i tak dalej. Każdy koncentrowałby się tylko na tym jednym zadaniu. Każdy kucharz (lub wątek) byłby blokowany synchronicznie, czekając, aż bekon będzie gotowy do przewrócenia lub grzanka do pęknięcia.
Odniesienia z koncepcji programowania asynchronicznego
Operacja synchroniczna wykonuje swoją pracę przed powrotem do dzwoniącego.
Operacja asynchroniczna wykonuje (większość lub całość) swoją pracę po powrocie do programu wywołującego.
Jeśli chodzi o definicję wykonywania synchronicznego „ w tym samym czasie ” (co czasem jest mylące), oto dobry sposób na jej zrozumienie:
Wykonanie synchroniczne : wszystkie zadania w bloku kodu są wykonywane jednocześnie.
Wykonanie asynchroniczne : nie wszystkie zadania w bloku kodu są wykonywane jednocześnie.
Myślę, że dobrym pomysłem na to jest klasyczny bieg sztafetowy
Synchroniczny : procesy takie jak członkowie tego samego zespołu, nie będą wykonywane, dopóki nie otrzymają pałki (koniec wykonywania poprzedniego procesu / programu uruchamiającego), a jednak wszystkie działają ze sobą w synchronizacji.
Asynchroniczny : tam, gdzie procesy, takie jak członkowie różnych zespołów na tej samej sztafecie, będą biegać i zatrzymywać się, asynchronizują się ze sobą, ale w ramach tego samego wyścigu (ogólne wykonanie programu).
Czy ma sens?
Inna angielska definicja Synchronize znajduje się tutaj
Koordynować; połączyć.
Myślę, że to lepsza definicja niż „dzieje się w tym samym czasie”. Jest to również definicja, ale nie sądzę, że pasuje do sposobu, w jaki jest używana w informatyce.
Zadanie asynchroniczne nie jest więc koordynowane z innymi zadaniami, podczas gdy zadanie synchroniczne JEST koordynowane z innymi zadaniami, więc jedno kończy się przed uruchomieniem drugiego.
Jak to osiągnąć, to inna kwestia.
Synchroniczny oznacza wykonanie kolejki po kolei. Załóżmy, że istnieje tylko pojazd, który musi być udostępniony przyjacielowi, aby dotrzeć do miejsca docelowego, jeden po drugim pojazd będzie udostępniony.
W przypadku asynchronicznym każdy przyjaciel może wynająć pojazd i dotrzeć do celu.
Tak, synchroniczny oznacza jednocześnie, dosłownie, oznacza pracę razem. wielu ludzi / obiektów na świecie może wykonywać wiele rzeczy jednocześnie, ale jeśli spojrzymy na komputer, to znaczy, że synchroniczne oznacza, że procesy współpracują ze sobą, co oznacza, że procesy są zależne od wzajemnego powrotu i dlatego są one wykonywane po drugim w odpowiedniej kolejności. Podczas gdy asynchroniczne oznacza, że procesy nie współpracują ze sobą, mogą one działać jednocześnie (jeśli są wielowątkowe), ale działają niezależnie.