Асинхронды, блоктаусыз, оқиғалар базасының архитектуралары арасындағы айырмашылық неде?

  1. What's the difference between:

    • Asynchronous,
    • Non-Blocking, and
    • Event-base architectures?
  2. Can something be both asynchronous and non-blocking (and event-based)?

  3. What's most important in programming, to have something: asynchronous, non-blocking and/or event-base (or all 3)?

Егер мысалдар келтірсеңіз, бұл керемет болар еді.

Бұл сұрақ туындайды, себебі мен ұқсас тақырыпта осы StackOverflow мақаласын оқыдым, бірақ ол Жоғарыда айтылған сұрақтарыма жауап беріңіз.

69

5 жауаптар

Asynchronous Asynchronous literally means not synchronous. Email is asynchronous. You send a mail, you don't expect to get a response NOW. But it is not non-blocking. Essentially what it means is an architecture where "components" send messages to each other without expecting a response immediately. HTTP requests are synchronous. Send a request and get a response.

Non-Blocking This term is mostly used with IO. What this means is that when you make a system call, it will return immediately with whatever result it has without putting your thread to sleep (with high probability). For example non-blocking read/write calls return with whatever they can do and expect caller to execute the call again. try_lock for example is non-blocking call. It will lock only if lock can be acquired. Usual semantics for systems calls is blocking. read will wait until it has some data and put calling thread to sleep.

Event-base This term comes from libevent. non-blocking read/write calls in themselves are useless because they don't tell you "when" should you call them back (retry). select/epoll/IOCompletionPort etc are different mechanisms for finding out from OS "when" these calls are expected to return "interesting" data. libevent and other such libraries provide wrappers over these event monitoring facilities provided by various OSes and give a consistent API to work with which runs across operating systems. Non-blocking IO goes hand in hand with Event-base.

Менің ойымша бұл терминдер бір-біріне сәйкес келеді. Мысалы, HTTP протоколы синхронды, бірақ блокталмаған IO пайдаланатын HTTP іске асинхронды болуы мүмкін. Оқу/жазу/тырысу сияқты оқшауланбайтын API қоңырауы синхронды (бірден жауап береді), бірақ «деректерді өңдеу» асинхронды болып табылады.

73
қосылды
Электрондық поштаны жібергенде қалай жауап беремін, бірақ жауап күтпеймін? Мен жауап күте отырып, өз ісіме көңіл бөле аламын.
қосылды автор Koray Tugay, көзі
Тұрақты сұрауды қажет ететін блоктау туралы жақсы нүкте, ал синхрондауды негіздеуге болады.
қосылды автор Alexander Torstling, көзі
Сіз синхронды деп жауап ретінде дереу жауап алды, бірақ мен синхронды кезде барлық сөздіктер оны анықтайды 'бір мезгілде болып жатқан' емес, 'дереу жауап'.
қосылды автор IntelliData, көзі

Асинхронды жабдықта, кодекс кейбір субъектілерден бірдеңе істеуді және әрекетті орындау кезінде басқа нәрселерді жасауға болады деп сұрайды; әрекетті аяқтағаннан кейін, әдетте код белгілі бір сәтте кодты береді. Бұғатталмаған архитектура кодты қызықтыратын өздігінен орын алатын әрекеттерге назар аударады және кодын мұндай әрекеттердің қандай болатындығын сұрауға мүмкіндік береді, бірақ код олар туралы нақты сұраған кезде мұндай әрекеттер туралы ғана біледі. Оқиғаға негізделген архитектура оқиғалардың өзінен-өзі пайда болған кезде кодын оңтайлы түрде хабардар етеді.

Кодтың 1000 байт алуды қалайтын сериялық портты қарастырыңыз.

Оқшауланған архитектурада код 1000 байт келгенше күтеді немесе бас тартуға шешім қабылдайды.

Асинхронды оқылған архитектурада код кодының драйверіне 1000 байт қажет екенін және 1000 байт келгенде хабарланады.

Блокталмаған архитектурада код кез келген уақытта қанша байтты сұратуы мүмкін және ол сәйкес келетін кез-келген деректерді оқи алады, бірақ барлық деректер келгенде білудің жалғыз жолы - сұрау; егер кодекс 1000-шы байт келген сәттен бастап екінші тоқсан ішінде білгісі келсе, онда әрбір тоқсаннан екінші секундты тексеруге болады.

Оқиға негізделген архитектурада сериялық порт драйвері кез келген деректер келгенде қолданбаны хабардар етеді. Драйвер бағдарламаның қанша байтын білетінін білмейді, сондықтан бағдарлама қолданбаның қажетіне қарағанда кішігірім немесе одан үлкен сомаларға арналған хабарландырулармен жұмыс істей алады.

17
қосылды

Мен үшін, блокталмау дегеніміз, бұл ағындағы әрекеттің басқа амалдардың орындалуына тәуелді емес, әсіресе критикалық бөлімді талап етпейді.

Асинхронды қоңырау шалушы ағынның сыртында болғандығын білдіреді және әлеуетті дефектирленеді. Әдетте орындалу басқа ағынның ішінде орын алады.

Бір мезгілдегі деректерді оқшаулау (құлыптаудың қажеті жоқ), бірақ синхронды болып табылады. Қайталанбайтын, синхронды түрде бір уақытта деректерді жазу бұғатталады (ерекше құлыпты қажет етеді). Негізгі ағын бойынша оны блокируя емес ету әдісі жазуларды асинхронды түрде жасау және оларды орындауды кейінге қалдыру болып табылады.

Оқиғаның тұжырымдамасы тағы бір нәрсе болып табылады, ол шамамен бірдеңе болса, бірдеңе болғанда хабардар болатыныңызды білдіреді. Жазулар синхронды түрде орындалса, жазба орындалғаннан кейін жүйенің басқа бөліктерін хабардар ету үшін оқиға болуы мүмкін. Басқа бөліктер оқиғаға жауап береді. Жүйе компоненттер арасындағы қарым-қатынас жасаудың жалғыз тәсілі (актерлік модельді ойлап табу) сияқты оқиғаларға ғана негізделуі мүмкін, бірақ бұл қажет болмауы керек.

Үш ұғым байланысты, бірақ мен үшін әртүрлі ұғымдар. Мүмкін, адамдар оны бір-бірімен алмастыра алады.

3
қосылды

Әдетте, тыйым салынбайтын архитектура әдіс шақыруларына негізделген, олар ұзақ уақыт бойы жұмысшы жіпінде орындалуы мүмкін болса, қоңырау шалу жіпін блоктамаңыз. Егер қоңырау шалушы ағыны туралы немесе оның тапсырмасынан ақпарат алуы қажет болса, онда жұмысшы ағыны орындалады, бұл үшін қоңырау шалушы ағынға дейін.

Оқиға негізіндегі архитектура кодының тұжырымдамасына негізделеді, ол шығарылған оқиғаларға жауап ретінде орындалады. Кодты орындау мерзімі әдетте детерминирлік емес, бірақ оқиғалар бұғаттау әдістерін шақыруы мүмкін; себебі жүйе оқиғаға негізделгендіктен, ол барлық әрекеттердің бұғатталуын білдірмейді.

Әдетте, асинхронды сәулет - оқиғаға негізделген, бұғатталмаған архитектура.

Асинхрондық қоңырау жасалғанда, оқиғалар өңдегіштер қоңырау шалушы қызықтыратын нәрсе болғанын хабарлау үшін үндестіру қызметтерін қамтамасыз ететін API арқылы тіркеледі. Одан кейін қоңырау дереу қайтарады (блоктаушы емес әрекет) және қоңырау шалушы орындауды жалғастыра алады. Оқиғалар қоңырау шалу процесіне қайтарылған кезде, олар осы процесте қандай да бір ағынмен өңделеді.

Оқиғалардың бірдей ағынмен өңделетінін не болмайтынын түсіну маңызды, себебі бұл орындалудың бұғатталмайтын сипатына әсер етеді, бірақ мен асинхронды орындауды басқаруды жүзеге асыратын кез-келген кітапхананы жеке білмеймін жалғыз ағын.

Жоғарыда келтірілген параграфты алып тастадым, себебі ол көрсетілгендей қате емес. Жүйедегі операциялар бұғатталмаған болса да, мысалы, ОЖ құрылғысына қоңырау шалу және орындауды жалғастыру сияқты болса да, менің ойымша, оқиғалар болған кезде, олар жұмыстан есептеу уақыты үшін басқа өңдеу тапсырмаларымен бәсекелеседі.

2
қосылды
Менің сұрағымның «анықтамалары» бөлігін шешудің өте жақсы жұмысы болмады деп ойлаймын; Жаңартуды жіберемін. Жоқ, бір ретті орындаудың сипаты әр операцияның жұмыс істеп тұрған кезде тежеп тұрғанын білдіреді, бұл асинхронды әрекетті одан да пайдалы етеді.
қосылды автор arootbeer, көзі
Сіздің соңғы абзацыңыз «асинхронды сәулет ... блокталмайды» деген өтінішке қайшы келеді емес пе?
қосылды автор nickb, көзі

Сондықтан бірінші және екінші сұраққа жауап беру үшін:

Бөгетсіздік асинхронды сияқты бірдей. Сіз қоңырау шалсаңыз, сіз кейінірек нәтиже ала аласыз, бірақ бұл кезде сіз басқа нәрсе жасай аласыз. Бұғаттау - керісінше. Жолды жалғастырмас бұрын қоңырауды қайтаруды күтесіз.

Енді Async/blocker емес коды мүлдем фантастикалық, және ол. Бірақ менің ескертулерім бар. Ұялы телефон сияқты шектеулі ортада жұмыс істегенде Async/Block-ке тыйым салу керемет ... шектеулі CPU/жады деп қарастырыңыз. Сондай-ақ, сіздің кодыңыз UI виджетіне қандай да бір жолмен жауап беруі керек болған кезде, алдыңғы нұсқаларды дамыту үшін жақсы.

Async барлық операциялық жүйелердің жұмыс істеуі үшін маңызды болып табылады - олар сізге фондық режимде жасалды және сіз сұрағандарыңызды жасаған кезде кодты оятуға мүмкіндік береді және бұл қоңырау сәтсіз болғанда сізге бұл немесе алып тастау немесе қандай да бір қайтару коды/қате нысаны арқылы жұмыс істейді.

Кодыңыз жауап беруі үшін біраз уақыт қажет ететін бір нәрсе сұрайтын кезде, сіздің ОС сіз басқа нәрселермен айналысу мүмкін деп білесіз. Сіздің код -  процесс, жіп немесе балама, блоктар. Сіздің кодыңыз ОЖ-да не болып жатқанын ескермегенде, ол желі байланысының күтілуін күтуде немесе ол HTTP сұранымынан жауап күтіп тұрған кезде немесе ол файлдарды оқу/жазуды күтіп тұрғанда толығымен ұмытпайды және осылайша. Сіз кодты тінтуірді басуды «жай» күте аласыз. Бұл уақыт ішінде сіздің операциялық жүйеңіз операциялық жүйені басқару, жоспарлау және «оқиғалар» үшін жауап беру - операциялық жүйені басқару үшін, I/O (пернетақта, тышқан, дискі, интернет), басқа тапсырмалар, сәтсіздікті қалпына келтіру және т.б.

Операциялық жүйелер - қатты ядро. Олар өте күрделі асинх/бұғатталмаған материалдарды сізден бағдарламашыны жасыруға шынымен жақсы. Бағдарламалық жасақтамалардың көпшілігі бағдарламалық жасақтамамен бүгінгі күні қайда барады. Енді біз CPU шектеулеріне соққы береміз, адамдар өнімділікті жақсарту үшін параллельді нәрселерді жасауға болады дейді. Бұл дегеніміз, Async/блокталмау өте қолайлы нәрсе сияқты көрінеді және иә, егер бағдарламалық жасақтама талап етсе, келісемін.

Егер сіз артқы веб-серверді жазсаңыз, онда сақ болыңыз. Есіңізде болсын, көлденеңінен көбірек арзанырақ бола аласыз. Netflix/Amazon/Google/Facebook бұл ережеге ерекше ерекшелік болып табылады, алайда, олар аз жабдықты пайдалану үшін арзанырақ жұмыс істейді.

Мен сізге айтып беремін, неге синхрондау/бұғатталмау коды - артқы жүйелермен кошмар.

1) Бұл өнімділік бойынша қызмет көрсетуден бас тартады ... сіз көп нәрсені ойлауыңыз керек, және сіз жол бойындағы көптеген қателіктер жібересіз.

2) Реактивті кодадағы іздерді анықтау мүмкін емес - не, қашан, неге және қалай аталатындығын білу қиын. Отладпен сәттілік.

3). Не істемегені туралы, әсіресе көптеген нәрселер оларды қалай жібергеніңізге байланысты қайтарылмайтыны туралы ойлану керек. Ескі әлемде сіз бір уақытта бір нәрсе жасадыңыз.

4) Сынау қиын.

5) Қолдау қиын.

6) Бұл ауыр. Бағдарламалау қуаныш пен көңілді болуы керек. Тек масочисты ауырсыну сияқты. Бір мезгілде/реактивті шеңберлерді жазатын адамдар садист болып табылады.

Иә, мен синхронды және синхронды жаздым. Мен осы парадигмамен 99.99 артқы қабырғадағы бағдарламаларды синхронды ала алады. Алдыңғы қолданбаларға реактивті код керек, мәселе жоқ және бұл әрдайым болды.

  1. Иә, код синхронды емес, блокталмаған және оқиғаларға негізделген болуы мүмкін.

  2. Бағдарламалаудағы ең маңызды нәрсе - сіздің кодыңыз жұмыс істейтініне және уақыттың қолайлы уақытында әрекет етілуіне көз жеткізу. Бұл негізгі қағидаға мұқият болыңыз және қате жібере алмайсыз.

1
қосылды