asynchroniczny vs nieblokujący

Jaka jest różnica między wywołaniami asynchronicznymi i nieblokującymi? Również między blokowaniem i synchronicznymi połączeniami (z przykładami proszę)?

Author: ArtB, 2010-04-13

12 answers

W wielu okolicznościach są to różne nazwy dla tej samej rzeczy, ale w niektórych kontekstach są zupełnie inne. To zależy. Terminologia nie jest stosowana w sposób całkowicie spójny w całej branży oprogramowania.

Na przykład w klasycznym interfejsie API gniazd, Gniazdo nieblokujące to takie, które po prostu powraca ze specjalnym komunikatem o błędzie "blokowałoby", podczas gdy gniazdo blokujące zostałoby zablokowane. Musisz użyć oddzielnej funkcji, takiej jak select lub poll, aby znaleźć Na Zewnątrz, kiedy jest dobry czas, aby spróbować ponownie.

Ale gniazda asynchroniczne (obsługiwane przez gniazda Windows), lub asynchroniczny wzorzec IO używany w. Net, są wygodniejsze. Wywołujesz metodę, aby rozpocząć operację, a framework oddzwania po jej zakończeniu. Nawet tutaj istnieją podstawowe różnice. Asynchronous Win32 sockets "marszczyć" swoje wyniki na określonym wątku GUI przez przekazywanie wiadomości okien, podczas gdy. NET asynchronous IO jest free-threaded (nie wiesz, jaki wątek wywołania zwrotnego zostanie wezwany).

Więc nie zawsze znaczą to samo. Aby rozpuścić przykład gniazda, możemy powiedzieć:
  • blokowanie i synchronizacja oznaczają to samo: wywołujesz API, to zawiesza wątek, dopóki nie ma jakiejś odpowiedzi i zwraca Ci ją.
  • Nieblokowanie oznacza, że jeśli odpowiedź nie może zostać szybko zwrócona, API natychmiast powróci z błędem i nie zrobi nic więcej. Musi więc istnieć jakiś powiązany sposób na sprawdzenie, czy API jest gotowe do wywołane (czyli aby skutecznie symulować oczekiwanie, aby uniknąć ręcznego sondowania w ciasnej pętli).
  • asynchroniczne oznacza, że API zawsze powraca natychmiast po rozpoczęciu" tła", aby spełnić twoje żądanie, więc musi istnieć jakiś powiązany sposób uzyskania wyniku.
 248
Author: Daniel Earwicker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-17 01:51:05
  • asynchroniczny odnosi się do czegoś wykonanego równolegle , powiedzmy, że jest to inny wątek.
  • Non-blocking często odnosi się do ankietowania, tj. sprawdzania, czy dany warunek się trzyma (gniazdo jest czytelne, urządzenie ma więcej danych, itp.)
 46
Author: Nikolai Fetissov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-12 21:24:50

Jak widać zapewne po mnogości różnych (i często wzajemnie się wykluczających) odpowiedzi, zależy to od tego, kogo zapytasz. W niektórych arenach terminy te są synonimami. Lub mogą odnosić się do dwóch podobnych pojęć:

  • jedna z interpretacji jest taka, że wywołanie zrobi coś w tle, zasadniczo nienadzorowanego, aby program nie był utrzymywany przez długi proces, którego nie musi kontrolować. Odtwarzanie dźwięku może być przykładem-program może wywołać funkcja odtwarzania (powiedzmy) mp3, a od tego momentu może kontynuować inne rzeczy, pozostawiając go systemowi operacyjnemu, aby zarządzać procesem renderowania dźwięku na sprzęcie dźwiękowym.
  • alternatywna interpretacja jest taka, że wywołanie zrobi coś, co program będzie musiał monitorować, ale pozwoli, aby większość procesu wystąpiła w tle tylko powiadamiając program w krytycznych punktach procesu. Przykładem może być np. plik asynchroniczny IO - program dostarcza bufor do systemu operacyjnego do zapisu do pliku, a system operacyjny powiadamia program tylko po zakończeniu operacji lub wystąpieniu błędu.

W obu przypadkach intencją jest, aby program nie został zablokowany w oczekiwaniu na zakończenie powolnego procesu - to, jak program ma zareagować, jest jedyną rzeczywistą różnicą. Który termin odnosi się do którego również zmienia się od programisty do programisty, język do języka lub platforma do platformy. Lub terminy mogą odnosić się do całkowicie różne koncepcje (np. wykorzystanie synchronicznych / asynchronicznych w odniesieniu do programowania wątków).

Przepraszam, ale nie wierzę, że istnieje jedna prawidłowa odpowiedź, która jest globalnie prawdziwa.

 15
Author: Mac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-12 22:02:08

[[5]] stawianie tego pytania w kontekście NIO i NIO.2 w java 7 async IO jest o krok bardziej zaawansowany niż nieblokowanie. W przypadku nieblokujących połączeń java NIO można ustawić wszystkie kanały (SocketChannel, ServerSocketChannel, FileChannel, itp.) jako takie, wywołując AbstractSelectableChannel.configureBlocking(false). Jednak po tym, jak wywołania IO powrócą, prawdopodobnie nadal będziesz musiał kontrolować kontrole, takie jak czy i kiedy ponownie odczytywać/zapisywać itp.
Na przykład,

while (!isDataEnough()) {
    socketchannel.read(inputBuffer);
    // do something else and then read again
}

Z asynchronicznym api w Javie 7, te kontrolki mogą być wykonane w bardziej wszechstronny sposób. Jednym z dwóch sposobów jest użycie CompletionHandler. Zauważ, że oba połączenia read nie są blokowane.

asyncsocket.read(inputBuffer, 60, TimeUnit.SECONDS /* 60 secs for timeout */, 
    new CompletionHandler<Integer, Object>() {
        public void completed(Integer result, Object attachment) {...}  
        public void failed(Throwable e, Object attachment) {...}
    }
}
 15
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-25 19:40:25

Synchroniczny / asynchroniczny to opis relacji pomiędzy dwoma modułami.
blokowanie / nieblokowanie polega na opisaniu sytuacji jednego modułu.

Przykład:
Moduł X: "I".
Moduł Y: "Księgarnia".
X pyta Y: czy masz książkę o nazwie "C++ primer"?

1) blokowanie: zanim y odpowie X, X czeka tam na odpowiedź. Teraz blokuje się X (jeden moduł). X i Y to dwa wątki lub dwa procesy lub jeden wątek lub jeden proces? my nie wiedzieć.

2) non-blocking: zanim y odpowie X, X po prostu odchodzi i robi inne rzeczy. X może wracać co dwie minuty, aby sprawdzić, czy y zakończył swoją pracę? Albo X nie wróci, dopóki Y do niego nie zadzwoni? Nie wiemy. wiemy tylko, że X może robić inne rzeczy, zanim Y skończy swoją pracę. Tutaj X (jeden moduł) jest nieblokujący. X I Y to dwa wątki lub dwa procesy lub jeden proces? nie wiemy. Ale jesteśmy pewni, że X i Y nie mogą być jednym wątkiem.

3) synchroniczne: zanim Y odpowie X, X czeka tam na odpowiedź. Oznacza to, że X nie może kontynuować, dopóki Y nie zakończy swojej pracy. Teraz mówimy: X i Y (dwa moduły) są synchroniczne. X i Y to dwa wątki lub dwa procesy lub jeden wątek lub jeden proces? nie wiemy.

4) asynchroniczny: zanim y odpowie X, X odejdzie i X może wykonywać inne zadania. X nie wróci, dopóki Y do niego nie zadzwoni. teraz mówimy: x I Y (dwa moduły) są asynchroniczne. X i Y są dwoma wątkami lub dwoma procesami lub jednym proces? nie wiemy. Ale jesteśmy pewni, że X i Y nie mogą być jednym wątkiem.


Proszę zwrócić uwagę na dwa pogrubione zdania powyżej. Dlaczego pogrubione zdanie w 2) zawiera dwa przypadki, podczas gdy pogrubione zdanie w 4) zawiera tylko jeden przypadek? Jest to klucz różnicy między nieblokującym a asynchronicznym.

Oto typowy przykład nieblokującego i synchronicznego:

// thread X
while (true)
{
    msg = recv(Y, NON_BLOCKING_FLAG);
    if (msg is not empty)
    {
        break;
    }
    sleep(2000); // 2 sec
}

// thread Y
// prepare the book for X
send(X, book);

Widać, że ten projekt jest nieblokujący (można powiedzieć w większości przypadków ta pętla robi coś bezsensownego, ale w oczach procesora X działa, co oznacza, że X nie blokuje), podczas gdy X i Y są synchroniczne, ponieważ X nie może nic zrobić (X nie może wyskoczyć z pętli), dopóki nie dostanie książki z Y.]} Zwykle w tym przypadku blokowanie X jest znacznie lepsze, ponieważ nieblokowanie wydaje dużo zasobów na głupią pętlę. Ale ten przykład jest dobry, aby pomóc ci zrozumieć fakt: nieblokowanie nie oznacza asynchronicznego.

Cztery słowa do łatwo nas zdezorientować, co powinniśmy pamiętać jest to, że cztery słowa służą do projektowania architektury. Nauka o tym, jak zaprojektować dobrą architekturę, jest jedynym sposobem, aby je odróżnić.

Na przykład, możemy zaprojektować taki rodzaj architektury:

// Module X = Module X1 + Module X2
// Module X1
while (true)
{
    msg = recv(many_other_modules, NON_BLOCKING_FLAG);
    if (msg is not null)
    {
        if (msg == "done")
        {
            break;
        }
        // create a thread to process msg
    }
    sleep(2000); // 2 sec
}
// Module X2
broadcast("I got the book from Y");


// Module Y
// prepare the book for X
send(X, book);

W tym przykładzie możemy powiedzieć, że

  • X1 nie blokuje
  • X1 i X2 są synchroniczne
  • X I Y są asynchroniczne

Jeśli potrzebujesz, możesz również opisać te wątki utworzone w X1 za pomocą czterech słów.

Ważniejsze rzeczy to: kiedy używamy synchronicznych zamiast asynchronicznych? kiedy używamy blokowania zamiast nieblokowania?

Dlaczego Nginx nie blokuje? Dlaczego Apache blokuje?

Aby dokonać dobrego wyboru, musisz przeanalizować swoje potrzeby i przetestować wydajność różnych architektur. Nie ma takiej architektury, która byłaby odpowiednia dla różnych potrzeb.

 13
Author: Yves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 02:25:38

A nieblokujące wywołanie zwraca natychmiast wszystkie dostępne dane: pełną liczbę żądanych bajtów, mniej lub wcale.

Anasynchroniczne wywołanie żąda transferu, który zostanie wykonany w całości (całości), ale zakończy się w przyszłości.

 12
Author: Koray Tugay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-27 20:11:48

Non-blocking: Ta funkcja nie będzie czekać na stosie.

Asynchroniczny: praca może być kontynuowana w imieniu wywołania funkcji po opuszczeniu stosu

 8
Author: Frank Schwieterman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-12 21:26:50

Blokowanie wywołania: Control zwraca tylko wtedy, gdy wywołanie zostanie zakończone.

Non blocking call: Control powraca natychmiast. Późniejsze OS w jakiś sposób powiadamia proces, że połączenie jest zakończone.


Synchronous program: program, który używa blokowania połączeń. Aby nie zamrozić podczas wywołania musi mieć 2 lub więcej wątków (dlatego nazywa się to synchroniczne-wątki działają synchronicznie).

Asynchroniczny program: a program, który używa Non blocking wywołań. Może mieć tylko 1 wątek i nadal pozostaje interaktywny.

 2
Author: Babken Vardanyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 12:30:46

Synchronous jest zdefiniowane jako dzieje się w tym samym czasie.

Asynchroniczny jest zdefiniowany jako nie występujący w tym samym czasie.

To właśnie powoduje pierwsze zamieszanie. Synchroniczne jest tak naprawdę to, co jest znane jako równoległe. Podczas gdy asynchroniczny jest sekwencyjny, zrób to, a następnie zrób tamto.

Teraz cały problem polega na modelowaniu zachowania asynchronicznego, ponieważ masz jakąś operację, która wymaga reakcji innej, zanim będzie mogła się rozpocząć. Tak więc jest to problem z koordynacją, skąd będziesz wiedział, że możesz teraz rozpocząć tę operację?

Najprostsze rozwiązanie znane jest jako blokowanie.

Blokowanie jest wtedy, gdy po prostu zdecydujesz się poczekać na inną rzecz do zrobienia i zwrócić odpowiedź przed przejściem do operacji, która tego potrzebowała.

Więc jeśli trzeba położyć masło na tosty, a więc najpierw trzeba toast hodowanych. Sposób, w jaki je koordynujesz, polega na tym, że najpierw wzniesiesz toast, a potem bez końca wpatrujesz się w toster, aż wystrzeli tosty, a potem posmarujesz je masłem.

To najprostsze rozwiązanie i działa bardzo dobrze. Nie ma prawdziwego powodu, aby go nie używać, chyba że masz również inne rzeczy, które musisz robić, które nie wymagają koordynacji z operacjami. Na przykład, robi naczynia. Po co czekać bezczynnie wpatrując się w toster stale na tosty do pop, kiedy wiesz, że zajmie to trochę czasu, i można umyć całe naczynie, podczas gdy to wykończenia?

W tym przypadku wchodzą dwa inne rozwiązania znane odpowiednio jako nieblokujące i asynchroniczne.

Nieblokowanie jest wtedy, gdy zdecydujesz się zrobić inne niepowiązane rzeczy, czekając na operację. Sprawdzanie dostępności odpowiedzi według własnego uznania.

Więc zamiast patrzeć na toster, żeby wyskoczył. Idź i umyj całe naczynie. A potem zerkasz na toster, żeby zobaczyć, czy toasty nie pękły. Jeśli nie, idź. umyj kolejne naczynie, sprawdzając z powrotem w tosterze między każdym naczyniem. Kiedy widzisz, że toasty pękły, przestajesz myć naczynia, a zamiast tego bierzesz tosty i przechodzisz do nakładania na nie masła.

Ciągłe sprawdzanie toastów może być denerwujące, wyobraź sobie, że toster jest w innym pokoju. Pomiędzy potrawami marnujesz czas idąc do drugiego pokoju, aby sprawdzić, co z tostem.

Nadchodzi asynchroniczny.

Asynchroniczny jest wtedy, gdy zdecydujesz się na rób inne niepowiązane rzeczy, czekając na operację. Zamiast sprawdzać to jednak, delegujesz pracę sprawdzania na coś innego, może to być sama operacja lub Obserwator, I masz to powiadomienie i ewentualnie interwencję, gdy odpowiedź jest dostępna, abyś mógł przejść do innej operacji, która tego potrzebowała.

To dziwna terminologia. Nie ma to większego sensu, ponieważ wszystkie te rozwiązania są sposobami tworzenia asynchronicznej koordynacji zadania zależne. Dlatego wolę nazywać to evented.

Więc w tym przypadku decydujesz się na ulepszenie tostera, aby brzmiał, gdy tosty są gotowe. Zdarza Ci się stale słuchać, nawet podczas robienia naczyń. Po usłyszeniu sygnału, ustawiasz się w kolejce w pamięci, że jak tylko skończysz myć obecne danie, zatrzymasz się i pójdziesz położyć masło na tostie. Albo możesz zdecydować się na interwencję mycia aktualnego naczynia i zająć się tostem od razu.

Jeśli jeśli masz problemy z usłyszeniem sygnału, możesz poprosić partnera, aby przypilnował tostera i przyszedł powiedzieć, kiedy toast będzie gotowy. Twój partner może sam wybrać jedną z powyższych trzech strategii, aby skoordynować swoje zadanie oglądania tostera i informując, kiedy są gotowe.

Na koniec, dobrze jest zrozumieć, że podczas gdy non-blocking i asynchroniczne (lub co wolę nazywać evented) pozwalają robić inne rzeczy, gdy czekasz, nie masz zbyt. Możesz wybrać stale pętla na sprawdzanie stanu połączenia nieblokującego, nie robi nic więcej. To jest często gorsze niż blokowanie chociaż (jak patrząc st toster, następnie z dala, a następnie z powrotem do niego, aż jego zrobić), więc wiele nieblokujących API pozwalają przejść do trybu blokowania z niego. W przypadku evented możesz po prostu czekać bezczynnie, aż zostaniesz o tym powiadomiony. Minusem w tym przypadku jest to, że dodanie powiadomienia było skomplikowane i potencjalnie kosztowne na początek. Trzeba było kupić nowy toster z funkcją beep lub przekonaj swojego partnera, aby obejrzał go dla Ciebie.

I jeszcze jedno, musisz zdać sobie sprawę z kompromisów, które zapewniają wszystkie trzy. Jeden nie jest oczywiście lepszy od innych. Pomyśl o moim przykładzie. Jeśli twój toster jest tak szybki, nie będziesz miał czasu na umycie naczynia, nawet nie zaczniesz go myć, tak szybko jest Twój toster. Rozpoczęcie pracy nad czymś innym w tym przypadku jest tylko stratą czasu i wysiłku. Blokowanie wystarczy. Podobnie, jeśli mycie naczynia zajmie 10 razy dłużej, to opiekanie. Ty musisz zadać sobie pytanie, co jest ważniejsze do zrobienia? Toast może być zimny i twardy do tego czasu, nie warto, blokowanie będzie również zrobić. Albo powinieneś wybrać szybsze rzeczy do zrobienia, czekając. Oczywiście jest więcej, ale moja odpowiedź jest już dość długa, chodzi mi o to, że musisz pomyśleć o tym wszystkim, i złożoności wdrażania każdego, aby zdecydować,czy warto, i czy rzeczywiście poprawi swoją wydajność lub wydajność.

Edit:

Mimo, że jest to już dawno, ja też chcę, żeby była kompletna, więc dodam jeszcze dwa punkty.

1) powszechnie istnieje również czwarty model znany jako multipleksed . To jest, gdy czekasz na jedno zadanie, uruchamiasz drugie, a gdy czekasz na oba, uruchamiasz kolejne i tak dalej, dopóki nie masz wielu zadań, które się rozpoczęły, a następnie czekasz bezczynnie, ale na wszystkich z nich. Tak szybko, jak to jest zrobione, można przystąpić do obsługi jego odpowiedzi, a następnie wrócić do czekania na innych. Jest znany jako multipleksowane, bo podczas oczekiwania, trzeba sprawdzić każde zadanie jeden po drugim, aby zobaczyć, czy są one wykonane, ad vitam, aż jeden jest. To trochę rozszerzenie na dodatek do normalnego nieblokowania.

W naszym przykładzie byłoby to jak uruchomienie tostera, potem zmywarki, potem kuchenki mikrofalowej itp. A potem czekanie na którąkolwiek z nich. Gdzie można sprawdzić toster, aby zobaczyć, czy to jest zrobione, jeśli nie, można sprawdzić zmywarkę, jeśli nie, kuchenka mikrofalowa, i wokół ponownie.

2) mimo, że ja uwierz, że jest to duży błąd, synchroniczny jest często używany do znaczenia jednej rzeczy na raz. I asynchroniczne wiele rzeczy na raz. W ten sposób zobaczysz synchroniczne blokowanie i nieblokowanie używane w odniesieniu do blokowania i nieblokowania. I asynchroniczne blokowanie i nieblokowanie stosowane w odniesieniu do multipleksowanych i eventowanych.

Nie bardzo rozumiem, jak się tam znaleźliśmy. Ale jeśli chodzi o IO i obliczenia, synchroniczne i asynchroniczne często odnoszą się do tego, co jest lepiej znane jako nie pokrywające się i / align = "left" / Oznacza to, że asynchroniczne oznacza, że IO i obliczenia nakładają się na siebie, aka, dzieje się jednocześnie. Podczas gdy synchroniczne oznacza, że nie są, a więc dzieje się sekwencyjnie. W przypadku synchronicznego nieblokowania oznaczałoby to, że nie uruchamiasz innych IO lub obliczeń, po prostu czekasz i symulujesz połączenie blokujące. Chciałbym, żeby ludzie przestali nadużywać tak synchronicznych i asynchronicznych. Więc nie zachęcam.

 1
Author: Didier A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-15 09:19:25

Różnią się tylko pisownią. Nie ma różnicy w tym, do czego się odnoszą. Aby być technicznym można powiedzieć, że różnią się one akcentem. Non blocking odnosi się do przepływu sterowania (nie blokuje.) Asynchroniczne odnosi się do tego, kiedy zdarzenie\dane jest obsługiwane (nie synchronicznie.)

 0
Author: stonemetal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-12 21:20:32

Modele blokujące wymagają, aby inicjująca aplikacja blokowała po uruchomieniu We/Wy. Oznacza to, że nie jest możliwe jednoczesne nakładanie przetwarzania i wejścia/Wyjścia. Synchroniczny model nieblokujący pozwala na nakładanie się przetwarzania i we/wy, ale wymaga, aby aplikacja sprawdzała Status We / Wy cyklicznie. Pozostawia to asynchroniczne, nieblokujące We/Wy, co pozwala na nakładanie się przetwarzania i we/wy, w tym Powiadamianie o zakończeniu We / Wy.

 0
Author: P.Gurung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-03 05:15:12

Blokowanie: Kontrola powraca do wywołania precess po zakończeniu przetwarzania primitive (sync lub async)

Brak blokowania: Kontrola powraca do procesu natychmiast po wywołaniu

 -2
Author: Moslema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-21 00:50:10