Asinchroninis ir ne blokavimas

Koks skirtumas tarp asinchroninių ir ne blokuojančių skambučių? Taip pat tarp blokavimo ir sinchroninių skambučių (prašome pateikti pavyzdžių)?

315
13 апр. nustatė user331561 balandžio 13 d 2010-04-13 00:12 '10 - 0:12 2010-04-13 00:12
@ 12 atsakymų

Daugeliu atvejų jie yra skirtingi to paties dalyko pavadinimai, tačiau kai kuriais atvejais jie yra visiškai skirtingi. Taigi tai priklauso. Terminologija nėra visiškai nuosekliai taikoma visoje programinės įrangos pramonėje.

Pavyzdžiui, klasikinių lizdų API yra ne blokavimo lizdas, kuris tiesiog grįžta iš karto su specialiu klaidos pranešimu „blokai“, o blokavimo lizdas yra užblokuotas. Turite naudoti atskirą funkciją, pvz., select arba poll , kad sužinotumėte, kada yra tinkamas laikas kartoti.

Tačiau asimetriniai lizdai (palaikomi „Windows“ lizdų) arba asinchroniniai I / O modeliai, naudojami .NET, yra patogesni. Jūs vadinate metodą, kad pradėtumėte operaciją, o sistema paskambina jums, kai tai daroma. Net ir čia yra didelių skirtumų. Asinchroniniai „Win32“ lizdai „vykdo“ savo rezultatus tam tikram GUI siūlui, perduodami „Window“ pranešimus, o .NET asinchroninis IO yra nemokamas (jūs nežinote, kuris pokalbis bus iškviestas).

Todėl jie ne visada reiškia tą patį. Norėdami nukreipti lizdo pavyzdį, galime pasakyti:

  • Užrakinimas ir sinchroniškumas reiškia tą patį: skambinate API, jis kabo, kol gauna atsakymą ir grąžins jį jums.
  • Ne blokavimas reiškia, kad jei atsakymo negalima greitai grąžinti, API nedelsiant grąžina klaidą ir nieko nedaro. Todėl reikia turėti tam tikrą susijusį metodą, kad būtų galima ištirti, ar API bus pasirengusi skambinti (ty veiksmingai imituoti laukimą, kad būtų išvengta rankinio apklausos siauroje kilpoje).
  • Asinchroninis reiškia, kad API visada grįžta iš karto, vykdydama „fono“ pastangas, kad įvykdytų jūsų užklausą, taigi rezultatui gauti reikia turėti tam tikrą metodą.
262
13 апр. Daniel Earwicker atsakymas, pateiktas balandžio 13 d 2010-04-13 00:24 '10 - 0:24 2010-04-13 00:24
  • Asinchroninis reiškia kažką, kas daroma lygiagrečiai , tarkim, kitą temą.
  • Ne blokavimas dažnai reiškia apklausą , t.y. patikrina, ar ši sąlyga įvykdyta (lizdas yra prieinamas skaityti, prietaisas turi daugiau duomenų ir tt).
45
13 апр. Nikolajus Fetissov atsakymas balandžio 13 d 2010-04-13 00:24 '10 - 0:24 2010-04-13 00:24

sinchroninis / asinchroninis yra ryšys tarp dviejų modulių.
blokavimas / blokavimas yra vieno modulio situacijos aprašymas.

Pavyzdys:
X modulis: „I“.
Y modulis: „Knygynas“.
X klausia Y: ar turite knygą, pavadintą „c ++ primer“?

1) blokavimas: prieš Y atsakymus X, X ir toliau laukia atsakymo. Dabar X (vienas modulis) yra užblokuotas. X ir Y dvi temos arba du procesai arba vienas srautas arba vienas procesas? mes nežinome.

2) neužblokavimas: prieš Y atsakydamas į X, X tiesiog eina ten ir daro kitus dalykus. X gali grįžti kas dvi minutes, kad patikrintų, ar Y baigė darbą? Arba X nepradės grįžti, kol Y jį vadins? Mes nežinome, tik žinome, kad X gali daryti kitus dalykus, kol Y baigia savo darbą. Čia X (vienas modulis) yra ne blokavimas. X ir Y dvi temos arba du procesai arba vienas procesas? mes nežinome. Bet mes esame tikri, kad X ir Y negali būti vienodi.

3) sinchroninis: prieš Y atsakymus X, X ir toliau laukia atsakymo. Tai reiškia, kad X negali tęsti, kol Y baigia darbą. Dabar sakome: X ir Y (du moduliai) yra sinchroniniai. X ir Y dvi temos arba du procesai arba vienas srautas arba vienas procesas? mes nežinome.

4) asinchroninis: prieš Y atsakymus X, X ten eina ir X gali atlikti kitą darbą. X nepradės grįžti, kol Y jį skambins. Dabar sakome: X ir Y (du moduliai) yra asinchroniniai. X ir Y dvi temos arba du procesai arba vienas procesas? mes nežinome. Bet mes esame tikri, kad X ir Y negali būti vienodi.


Atkreipkite dėmesį į aukščiau pateiktus du riebalų sakinius. Kodėl 2-ajame paryškintame sakinyje yra du atvejai, o 4-ajame paryškintame sakinyje yra tik vienas atvejis? Tai yra raktas į skirtumą tarp blokavimo ir asinchroninio.

Čia yra tipinis blokavimo ir sinchroniškumo pavyzdys:

 // 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); 

Jūs galite pamatyti, kad šis dizainas yra ne blokuojantis (galite pasakyti, kad didžiąją laiko dalį šis ciklas daro kažką prasmės, bet procesoriaus akyse X veikia, o tai reiškia, kad X yra ne blokuojantis), o X ir Y yra sinchroniniai, nes X ir Y yra sinchroniniai, nes X negali tęsti kitų dalykų (X negali išeiti iš kilpos), kol jis gauna knygą iš Y.
Paprastai šiuo atveju X užraktas yra daug geresnis, nes neužblokavimas praleidžia daug išteklių kvailai linijai. Tačiau šis pavyzdys yra naudingas, kad padėtų jums suprasti šį faktą: neužblokavimas nereiškia asinchronijos.

Šie keturi žodžiai lengvai supainioja mus, ir mes turime prisiminti, kad šie keturi žodžiai padeda sukurti architektūrą. Mokymasis kurti gerą architektūrą yra vienintelis būdas juos atskirti.

Pavyzdžiui, galime sukurti šią architektūrą:

 // 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); 

Čia pateiktame pavyzdyje galime pasakyti

  • X1 blokavimas
  • X1 ir X2 yra sinchroniniai
  • X ir Y asinchroniniai

Jei reikia, galite aprašyti šias temas, sukurtas X1, keturiais žodžiais.

Svarbesni dalykai: kada mes naudojame sinchroninį, o ne asinchroninį? kada mes naudojame užrakinimą, o ne blokavimą?

Kodėl Nginx yra blokuojamas? Kodėl Apache blokuoja?

Kad galėtumėte teisingai pasirinkti, reikia išanalizuoti savo poreikius ir išbandyti įvairių architektūrų veikimą. Nėra tokios architektūros, kuri būtų tinkama skirtingiems poreikiams.

18
08 июля '15 в 19:07 2015-07-08 19:07 atsakymą pateikė „ Yves “ liepos 08-15 dienomis 19:07 2015-07-08 19:07

Pateikiant šį klausimą „NIO“ ir „NIO.2“ kontekste, „Java 7“, async IO yra vienas žingsnis labiau pažengęs nei neužblokavimas. Naudodami ne blokuojančius „Java“ NIO skambučius galite nustatyti visus kanalus („SocketChannel“, „ServerSocketChannel“, „FileChannel“ ir pan.). Tokiu būdu skambindami „ AbstractSelectableChannel.configureBlocking(false) . Tačiau, grįžę į IO skambučius, greičiausiai turėsite stebėti patikrinimus, pavyzdžiui, kada ir kada skaityti / rašyti ir pan.
Pavyzdžiui

 asyncsocket.read(inputBuffer, 60, TimeUnit.SECONDS , new CompletionHandler<Integer, Object>() { public void completed(Integer result, Object attachment) {...} public void failed(Throwable e, Object attachment) {...} } } 
15
22 сент. Atsakymas duotas Anthony Sep 22 2012-09-22 01:42 '12 ne 1:42 2012-09-22 01:42

Kaip matote iš daugelio skirtingų (ir dažnai tarpusavyje nesuderinamų) atsakymų, tai priklauso nuo to, ką jūs prašote. Kai kuriose arenose terminai yra sinonimai. Arba jie gali nurodyti dvi panašias sąvokas:

  • Vienas iš aiškinimų yra tas, kad kvietimas darys kažką fone, iš esmės nekontroliuojamas, kad programa nebūtų laikoma ilgą procesą, kad jo nereikia kontroliuoti. Garsinis atkūrimas gali būti pavyzdys - programa gali skambinti funkcijai, kuria galima žaisti (pvz., Mp3), ir nuo to momento galite tęsti kitus veiksmus, paliekant jį OS valdyti garso atkūrimo procesą garso įrenginyje.
  • Alternatyvus aiškinimas yra tas, kad skambutis atliks tai, ką programa turės kontroliuoti, bet leis daugumai procesų atsirasti fone, pranešant apie programą tik kritiniuose taškuose. Pavyzdžiui, asinchroninis IO failas gali būti pavyzdys - programa pateikia operacinei sistemai buferį rašyti į failą, o OS informuoja tik programą, kai operacija yra baigta arba įvyksta klaida.

Bet kuriuo atveju, ketinama leisti programai neužblokuoti, laukiant lėto proceso pabaigos - tikimasi, kad programa reaguos - vienintelis realus skirtumas. Kuris terminas reiškia tai, kas taip pat keičiasi nuo programuotojo iki programuotojo, iš kalbos į kalbą, arba nuo platformos prie platformos. Arba terminai gali būti susiję su visiškai skirtingomis sąvokomis (pavyzdžiui, sinchroniniu / asinchroniniu programavimo sriegių atžvilgiu).

Atsiprašome, bet nemanau, kad yra teisingas atsakymas, teisingai.

15
13 апр. Atsakymas pateikiamas Mac 13 balandžio. 2010-04-13 01:02 '10 ne 1:02 2010-04-13 01:02

Netrukdomas skambutis nedelsiant grąžinamas su visais turimais duomenimis: bendras prašomų baitų skaičius, mažesnis ar nieko.

Astronominis asinchroninis skambutis reikalauja perdavimo, kuris bus atliktas kaip visuma (visas), bet bus baigtas ateityje.

12
27 февр. Atsakymą pateikė Koray Tugay 27 vasario mėn. 2015-02-27 23:11 '15 ne 23:11 2015-02-27 23:11

Neblokavimas: ši funkcija nelaukia kamino.

Asinchroninis: darbas gali būti tęsiamas funkcijų skambučio vardu po to, kai šis skambutis paliekamas

8
13 апр. Frank Schwieterman atsakymas, pateiktas balandžio 13 d 2010-04-13 00:26 '10 - 0:26 2010-04-13 00:26

Blokuoti : valdymas grąžinamas tik pasibaigus pokalbiui.

Neblokuojantis skambutis : valdiklis grįžta iš karto. Vėliau OS kažkaip praneša apie skambučių užbaigimo procesą.


Sinchroninė programa: programa, kuri naudoja blokavimo skambučius. Kad pokalbio metu neužšaldytų, jis turi turėti 2 arba daugiau sriegių (todėl jis vadinamas sinchroniniu - siūlai veikia sinchroniškai).

Asinchroninė programa: programa, kuri naudoja ne blokuojančius skambučius. Jis gali turėti tik 1 srautą ir vis dar būti interaktyvus.

2
02 мая '14 в 14:32 2014-05-02 14:32 atsakymas pateikiamas Babken Vardanyan 02 gegužės 14 d. 14:32 2014-05-02 14:32

Sinchroninis yra apibrėžiamas kaip vienu metu.

Asinchroninis yra apibrėžiamas kaip neveikiantis vienu metu.

Tai sukelia pirmąją painiavą. Sinchroninis iš tiesų yra tai, kas vadinama lygiagrečiu. Tol, kol asinchroninis yra nuoseklus, tai atlikite ir atlikite.

Dabar visa problema yra asinchroninio elgesio imitavimas, nes turite tam tikrą operaciją, kuriai prieš pradedant jį reikia kitokio atsakymo. Taigi tai yra koordinavimo problema, kaip jūs žinote, kad dabar galite pradėti šią operaciją?

Paprasčiausias sprendimas vadinamas užrakinimu.

Blokavimas yra tada, kai jūs tiesiog nuspręsite palaukti, kol bus užbaigtas kitas dalykas, ir grąžinkite atsakymą prieš tęsdami operaciją, kurios jai reikia.

Taigi, jei jums reikia įdėti skrudintuvą sviestui, ir todėl pirmiausia reikia pakepti atskiestą. Jūs galėtumėte juos koordinuoti, kad juos iš pradžių kepintumėte, ir tada neribotai žiūrėkite į skrudintuvą, kol jis pakils, o tada tepate įpilkite aliejaus.

Tai paprasčiausias sprendimas ir veikia labai gerai. Nėra jokios realios priežasties to nenaudoti, nebent turite kitų dalykų, kuriuos reikia padaryti, todėl nereikia koordinuoti operacijų. Pavyzdžiui, plauti indus. Kodėl palaukite, žiūri į skrudintuvą, kad skrudinta skrudinta, jei žinosite, kad užtruks šiek tiek laiko, ir jūs galite plauti visą patiekalą, kol jis baigiasi?

Čia žaidžiami du kiti sprendimai, vadinami neužblokuojančiais ir asinchroniniais.

Neužblokavimas yra tada, kai nuspręsite atlikti kitus nesusijusius dalykus laukdami, kol veiksmas bus baigtas. Patikrinkite atsakymo prieinamumą savo nuožiūra.

Taigi, užuot žiūrėjęs į skrudintuvą, kad jis sprogo. Jūs einate ir plauti visą patiekalą. Ir tada pažvelgti į skrudintuvą, kad pamatytumėte, ar skrudinta duona. Jei jie neturi, plaukite kitą patiekalą, patikrindami skrudintuvą tarp kiekvieno patiekalo. Kai pamatysite, kad skrudinta duona, jūs nustosite skalbti indus, o vietoj to paimkite skrudintą duoną ir paskui ją skleisti su sviestu.

Tačiau būtinybė nuolat tikrinti skrudintuvus gali būti erzina, įsivaizduokite, kad skrudintuvas yra kitame kambaryje. Tarp valgių praleidžiate savo laiką apsilankę kitoje patalpoje, norėdami patikrinti skrudintą duoną.

Čia eina asinchroninis.

Asinchroninis yra tada, kai nuspręsite atlikti kitus nesusijusius dalykus, kol laukiate, kol veiksmas bus baigtas. Tačiau vietoj to tikrinimo jūs deleguojate kažko kito tikrinimo darbą, tai gali būti pati operacija arba stebėtojas, ir apie tai turėtumėte pranešti ir galbūt nutraukti, kai atsakymas yra prieinamas, kad galėtumėte persijungti į kitą operaciją, kuri buvo reikalinga

Tai yra keista terminologija. Tai nėra labai prasminga, nes visi šie sprendimai yra būdai, kaip sukurti asinchroninį priklausomų užduočių koordinavimą. Štai kodėl aš norėčiau jį pavadinti vakare.

Taigi, jūs nusprendėte atnaujinti skrudintuvą taip, kad būtų skleidžiami skrudintuvai. Jūs nuolat klausotės, net kai plaunate indus. Kai išgirsite pyptelėjimą, eilėje atsidursite savo atmintyje, kad tuoj pat, kai baigsite skalbimo indą, sustosite ir užpildysite sviestą. Arba galite nutraukti dabartinio patiekalo plovimą ir nedelsdami susitvarkyti su skrudintaisiais skoniais.

Jei turite problemų su garsu, galite paprašyti savo partnerio žiūrėti skrudintuvą ir pasakyti, kada skrudinta duona yra paruošta. Jūsų partneris gali pasirinkti vieną iš trijų aukščiau nurodytų strategijų, kad galėtų koordinuoti savo užduotį: žiūrėti skrudintuvą ir pranešti, kada jis pasiruošęs.

Apibendrinant, gerai suprasti, kad nors neužblokuojantys ir asinchroniniai (ar tai, ką aš norėčiau skambinti netgi), iš tikrųjų leidžia jums daryti kitus dalykus, o jūs laukiate, taip pat neturite jų. Nuolatinis skambučio statusas gali būti nuolat tikrinamas nedarant nieko. Tai dažnai būna blogesnė už blokavimą (pvz., Žiūri į skrudintuvą, tada ieško, tada grįžta į jį, kol bus padaryta), todėl daugelis ne blokuojančių API leidžia pereiti nuo užrakto režimo į jį. Įvykus įvykiui, galite tiesiog palaukti, kol gausite pranešimą. Šiuo atveju trūkumas yra tas, kad pranešimo pridėjimas buvo sunkus ir galbūt brangus nuo pat pradžių. Jūs turėjote nusipirkti naują skrudintuvą su pyptelėjimu arba įtikinti savo partnerį, kad jis jį stebėtų.

Ir dar vienas dalykas, jums reikia suprasti kompromisus, kuriuos teikia visi trys. Vienas iš jų akivaizdžiai nėra geresnis nei kitas. Pagalvokite apie mano pavyzdį. Jei turite tokį greitą skrudintuvą, jūs neturėsite laiko plauti indus, netgi nepradėkite plauti, kaip greitai jūsų skrudintuvas. Ką daryti kitaip šiuo atveju yra tiesiog laiko ir pastangų švaistymas. Užraktas darys. Panašiai, jei skalbimo indai truks 10 kartų ilgiau nei skrudinimas. Turite savęs paklausti, ką daryti dar svarbiau? Iki to laiko, skrudinta duona gali tapti šalta ir kieta, o ne verta, užraktas taip pat veiks. Arba turėtumėte pasirinkti greičiau, kol laukiate. Tai labiau akivaizdu, bet mano atsakymas jau yra gana ilgas, mano nuomone, jūs turite galvoti apie visa tai, taip pat sunkumus, su kuriais susiduriate įgyvendinant kiekvieną iš jų, nuspręsti, ar tai verta, ar tai tikrai pagerins jūsų rezultatus. ar našumą.

Redaguoti:

Nors tai jau seniai, aš taip pat noriu, kad jis būtų baigtas, todėl pridėsiu dar du punktus.

1) Taip pat yra ketvirtasis modelis, žinomas kaip „ multipleksas“ . Tai yra tada, kai tikitės vienos užduoties, pradėsite kitą, o kol laukiate abiejų, pradėsite kitą, ir tt, kol turėsite daug užduočių ir tada laukiate tuščiosios eigos laiko, bet visiems. Todėl, kai tik tai bus padaryta, galite tęsti savo atsakymo apdorojimą ir tada grįžti į likusį laiką. Tai vadinama „multipleksu“, nes kol laukiate, turite patikrinti kiekvieną užduotį po vieną, kad įsitikintumėte, jog jie yra baigti, kol vienas iš jų bus baigtas. Tai kažkas panašaus į įprastą ne blokavimą.

Mūsų pavyzdyje tai būtų kaip skrudintuvas, tada indaplovė, mikrobangų krosnelė ir pan. Visur, kur jūs patikrinote skrudintuvą, norėdami pamatyti, ar tai buvo padaryta, jei ne, patikrinkite indaplovę, jei ne, mikrobangų krosnelę ir dar kartą.

2) Nors manau, kad tai yra didelė klaida, sinchroniškai dažnai naudojamas vienas dalykas vienu metu. Ir asinchroninis daugelis dalykų vienu metu. Tokiu būdu matysite sinchroninį blokavimą ir neblokavimą, nurodant blokavimą ir blokavimą. Tiek asinchroninis užraktas, tiek neužrakinimas yra naudojami multipleksavimui ir lygiavimui pažymėti.

Aš tikrai nesuprantu, kaip mes ten pasiekėme. Bet kai kalbama apie I / O ir skaičiavimus, sinchroninis ir asinchroninis dažnai nurodo tai, kas geriau žinoma kaip nesutampa ir sutampa. Tai reiškia, kad asinchroninis reiškia, kad I / O ir skaičiavimo sutampa, ty jie atsiranda vienu metu. Nors sinchroniškai reiškia, kad taip nėra, tai vyksta nuosekliai. Sinchroninio blokavimo atveju tai reiškia, kad nepradedate kitų I / O operacijų ar skaičiavimų, bet tiesiog laukiate ir imituoja blokavimo skambutį. Norėčiau, kad žmonės nustotų piktnaudžiauti sinchroniniu ir asinchroniniu. Taigi nepritariu tai.

1
15 мая '18 в 11:26 2018-05-15 11:26 atsakymas buvo duotas Didieriui A. gegužės 15 d., 18 val., 11:26, 2018-05-15 11:26

Jie skiriasi tik rašybos. Nėra skirtumo, ką jie vadina. Kad būtų techninis, galite pasakyti, kad jie skiriasi akcentais. Ne blokavimas reiškia valdymo srautą (jis nėra užblokuotas). Asinchroninis reiškia, kai duomenų įvykis yra apdorojamas (ne sinchroniškai).

0
13 апр. Stonemetalo atsakymas balandžio 13 d 2010-04-13 00:20 '10 - 0:20 2010-04-13 00:20