Асинхронно програмиране: видове, класификация, принципи на програмиране, концепция, значение и приложение

Асинхронното програмиране (АП) е форма на паралелно програмиране, която позволява на структурна единица от системата да работи отделно от основната нишка на приложението. Когато задачата е завършена, тя уведомява главната нишка дали задачата е завършена или не. Такова програмиране е полезно, тъй като увеличава поддържаната честотна лента, което го прави привлекателно, предвид нарастващото търсене на интернет за силно мащабируеми системи.

Асинхронни модели за програмиране

Създадени са различни модели на AP за обработка на непрекъснатостта на резултата от неблокиращи операции след приключването им. Техните предимства се оценяват по отношение на това доколко се доближават до схема, която е възможно най-близка до последователна.

Асинхронни модели за програмиране

Видове модели на AP:

  1. Модел на стъпките на продължаване - модел на последователните стъпки. Това е най-използваният асинхронен модел в Node JS. Всяка функция получава информация за това как трябва да обработва резултата от успеха или неуспеха на операцията.
  2. Модел на събитията - моделът на събитията използва архитектура, управлявана от събития, която позволява на неблокиращи операции да докладват за завършването си при признаци на успех или неуспех, изисква корелация за синхронизация.
  3. Модел на обещанията - Моделът на обещанията се обяснява с върнатите стойности на неблокиращи операции, независимо от момента, в който са получени определените стойности за успех или неуспех.
  4. Модел на генератора. Генераторите се използват за временно връщане на управлението към извикващата програма и след това за връщане към подпрограмата чрез възстановяване на състоянието в точката, в която е била спряна.

Архитектурни принципи на Node

Въпреки че Node JS напоследък е обект на остри критики за използването на изчислителни цикли поради еднонишковата си среда, неговата философия, основана на три силни архитектурни принципа, остава търсена.

JavaScript е асинхронен по своята същност, точно както Node. Платформа към за изпълнение на JavaScript от страна на сървъра, Node.js беше представена през 2009 г., като използва асинхронен модел на вход/изход, управляван от събития, което я прави ефективна и мащабируема.

Чат е най-типичният пример за многопотребителско приложение на Node.js в реално време. Започвайки с IRC за много собственически и отворени протоколи на нестандартни портове, стана възможно да се реализира всичко в съвременния Noje.js с WebSockets, работещи по подразбиране на същия порт 80, които слушат за нови съобщения, изпратени от техните клиенти. От страна на клиента има HTML страница с няколко конфигурирани обработващи програми, една за бутона "Изпрати", която избира съобщение и го изпраща към WebSocket, и една, която слуша за съобщения, идващи към клиента. Очевидно е, че това е прост и основен модел, но се базира на различно изменение на сложността.

Неактивният модел, който Node JS използва в API, за да поддържа асинхронно програмиране, е стъпка към продължаване. Всяка неблокираща операция получава функция като последен параметър, която включва логика за продължаване. Той ще бъде извикан след края на операцията, както за обработка на резултатите в случай на успех или неуспех. Функцията "Продължаване" ви позволява да укажете на блокиращата операция как да продължи след приключване на операцията.

Архитектурни принципи на Node

Последователно управление на потока

За да продължим в рамките на този модел да създаваме последователни нишки на изпълнение, е необходимо всяка следваща функция да бъде верижна като продължение на предишната, като резултатите ще бъдат обработвани в случай на успех или неуспех. Това води до диагонализация на кода, която е наречена адската пирамида (callback hell) поради липсата на практическа възможност за контрол, докато броят на последователните вериги расте минимално.

Последователно управление на потока

Паралелизация - асинхронното изпълнение на неблокиращи операции се извършва незабавно, тъй като простото им извикване се изпълнява във фонов режим по дефиниция. За да се превърнат блокиращите операции в неблокиращи, е необходим малък процес на капсулиране, който да изпълнява операцията във фонов режим.

Асинхронно изпълнение на неблокиращи операции

Синхронизиране на непрекъснати функции

Тя изисква верига в края на всяка паралелна поредица от функции за завършване, която прилага определена логика само след като, след като е потвърдено, че всички паралелни клонове са завършени. За осъществяването на тази проверка се използват диаграми, базирани на броячи.

Синхронизация на функциите за продължаване

Пример за използване на континуатори:

  1. Паралелизация, цикълът позволява да се изпълнят всички неблокиращи двойки четене-броене по неблокиращ начин.
  2. Последователност, всяка двойка четене се чете чрез стъпка на функцията за продължаване.
  3. Синхронизация, всеки паралелен клон получава последно продължение, което изпълнява логиката на завършване веднага след като всички клонове са завършени.

Библиотеки за непрекъснатост

Съществуват много библиотеки, които могат да помогнат опростяване на живота на разработчиците, работещи с модела AP. Някои от тях са свързани не само с AS, но и с функционалната парадигма, което произтича от факта, че механизмите за прилагане на връзките са основно функционални предимства.

Видове библиотеки:

  1. Async е вероятно най-известната и най-широко използваната библиотека за асинхронно програмиране, базирано на продължението. Той предлага различни методи за контрол на потока за неблокиращи функции.
  2. Join - представлява реализация на метод за синхронизация, който може да се намери в други езици, като например C и работа с нишки. Това може да се използва и в обещания, въпреки че в този случай употребата му е по-малко уместна.
  3. Fn.js е отлична библиотека, която реализира различни методи за функционален контрол. Практическата му приложимост в този контекст се дължи на възможностите, които предоставя за генериране на неблокиращи функции и прилагане на валидиране.

Предимства и недостатъци

Асинхронното програмиране, базирано на продължаването, е добър вариант за ситуации с проста логика за управление на потока. Обикновено се прилага за програми в Node JS, които позволяват дефиниране на неблокиращ отговор на входящи заявки.

Предимства на модела:

  1. Прости модели на заявки и отговори.
  2. Съгласуваност със схемите на функционалното програмиране.
  3. Лесен за разбиране като концептуален механизъм.

Недостатъци:

  1. Когато логиката на управление не е достатъчно добре проектирана, процесът става по-сложен, което води до код с разпределена функционална логика, който е труден за четене, разбиране и поддръжка.
  2. Трудност при дефинирането на логиката за управление на потока.
  3. Усъвършенствани механизми за синхронизация.
  4. Логиката за управление се разпределя към всеки неблокиращ клон.

Модел, управляван от събития

Събитието е сигнал в бизнес екосистемата. От анатомична гледна точка те обикновено се състоят от тип, времеви печат и набор от данни, описващи контекста, в който е настъпило събитието. Архитектурата на събитията (EDA) осигурява механизъм за комуникация между клиенти и доставчици в съотношение 1:N и номинално отделена връзка. Една от многото му употреби е за отстраняване на проблеми при асинхронна обработка на данни.

В централизираните архитектури, базирани на събития, има централен посредник на комуникационната шина, който отговаря за ефективното регистриране на слушащите клиенти и задействането на известия при поискване към доставчиците. Този механизъм дава възможност за N:N захранване и схемата се нарича PUB/SUB модел.

В разпределените архитектури, базирани на събития, всеки доставчик е отговорен за управлението на абонаментите на своите клиенти и за изпращането на известия при настъпване на събитие. Механизмът за комуникация също е номинално отделен, но обикновено броят на доставчиците и клиентите е 1:N. Този модел съответства на наблюдавания модел или източници на събития на жаргона на Node JS.

Изчислителна абстракция: обещание

Изчислителна абстракция: обещание

Обещанието е изчислителна абстракция, която представлява ангажимент от страна на извикана неблокираща операция да предостави отговор на извикващата програма, когато резултатът бъде получен след завършване. Обещанието е обект, който предоставя два метода, позволяващи логическа обработка в случай на успех или неуспех.

Те реагират на прост жизнен цикъл, който трябва да се знае, за да може да се обработва. Съществената стойност на обещанието се състои в два принципа. Първо, логиката на процеса се прилага само веднъж в случай на успех или неуспех. И второ, тя гарантира, че логиката на успеха или неуспеха е изпълнена, дори ако обещанието е решено преди, както и въведени от неговите водачи. Ако е необходимо, обещанието чака своите обработващи, асинхронни Програмиране на JavaScript.

Има няколко начина да получите обещания, които могат да бъдат идентифицирани като модели на изграждане, които се появяват периодично при използването на този модел. Дефиницията на ES6 включва обещания и Node JS версия 0.12 поддържа тази спецификация. Освен това има няколко библиотеки, които прилагат модела на обещанията. За да се получи сравнителна референтна рамка, беше определен стандартът Promises A+, който управлява всички реализации с наличните тогава.

Синхронно и асинхронно програмиране

Препоръчително е да използвате JavaScript AP, като изтеглите всички негови тагове и кода на доставчика от него. Това осигурява най-добра съвместимост с най-голям брой доставчици. Това разположение дава на всички тагове на доставчиците най-голяма възможност да завършат проследяването, преди посетителят да премине към следващата страница.

Синхронното зареждане се случва, когато браузърът трябва да спре да визуализира страницата, за да завърши изпълнението на кода на JavaScript. Ако открие синхронен JS таг, той блокира показването на страницата, докато кодът не бъде завършен. Това е аналогично на бавно движещ се камион на път с една лента за движение, която се забавя зад него. Съвременните уебсайтове са се отказали от този метод, тъй като той крие пряк риск от забавяне на времето за зареждане на страницата.

Недостатъкът на този метод е, че целият сайт е блокиран от пълното зареждане на тага. И въпреки че доставчиците на етикети имат споразумения за ниво на обслужване за срока на доставката, изпълнението може да бъде повлияно от няколко фактора. Те включват бавно време за реакция, свързано с доставчиците, поддържане на ненужни сървъри за приложения в хибриден модел клиент-сървър и бавен интернет трафик. Ако потребителят зарежда таговете синхронно, се препоръчва доставчикът да има време за реакция 100 милисекунди (ms) или по-бързо.

Синхронното и асинхронното програмиране чрез API са интерфейси за програмиране на приложения, които връщат данни за заявките веднага или съответно по-късно. Синхронните и асинхронните приложни програмни интерфейси (API) предоставят възможност за извършване на незабавни или планирани заявки за ресурси, данни или услуги, когато те са налични. Съвременен метод, за уебсайтове, е асинхронното зареждане на тагове.

При този метод кодът на JavaScript се обработва паралелно с останалото съдържание на страницата. Това означава, че дори ако даден таг на доставчика реагира или се зарежда бавно, той няма да забави останалата част от страницата. Чрез този подход не само можете да разделите таговете на JavaScript, които се зареждат независимо, но и асинхронният метод свежда до минимум влиянието на зареждането на външни JS файлове върху процеса на рендиране на страницата.

Разбиране и профилиране на C #

Разбиране и профилиране на C #

Microsoft и общността .NET значително опрости AP, като въведе асинхронно изчакване в C #. Последни версии на ASP.NET го използва активно за подобряване на производителността. Много инструменти за мониторинг на производителността и профилиране се опитват да поддържат и визуализират производителността на асинхронното програмиране 1С. Продукти с префикс Stackify & Retrace има отлична поддръжка за приложения, използващи C # async await. Първо, трябва да разберем как всъщност работи код, който използва async awai" и HttpClient като пример.

Разбиране и профилиране на C #

С помощта на ILSpy можете да видите как компилаторът преобразува този код в AsyncState Machine. Машината с крайни състояния изпълнява целия сложен код под прикритие, което позволява на разработчиците да пишат асинхронен код.

HttpClient като пример

Профилирането на асинхронното програмиране в C 5 0 е трудно, тъй като то пресича нишки. Традиционно един метод и всички негови подчинени извиквания на методи се извършват в една нишка. Това улеснява разбирането на връзката между родителските и подчинените методи. При асинхронния код ситуацията е различна. Родителският метод се изпълнява в една нишка. Когато започне операция за вход/изход, кодът в тази нишка се прекратява. Когато дадена I/O операция завърши, тя продължава да се изпълнява в нова нишка. Свързването на кода между тези нишки като част от по-голяма транзакция е трудно.

AIOHTTP: сървър-клиент за asyncio

Aiohttp позволява на потребителите да създават асинхронни сървъри и клиенти. Пакетът за асинхронно програмиране aiohttp работи за клиентски и сървърни уеб сокети. Документацията в този пример aiohttp се използва за улавяне на HTML страница.

AIOHTTP: сървър-клиент за asyncio

Този пример показва как да изтеглите един или повече файлове, но можете да изтеглите файлове и чрез. Той определя няколко нови елемента, като asynctimeout. Това създава мениджър на контекста на времето за изчакване. По-долу кодът създава асинхронен цикъл за синхронизация и го използва като основна функция.

Създаване на обект Client Session в главната асинхронна програмна функция и копрограма, както и на копрограмна функция, която събира URL адреса на всичко, какво е необходимо изтегляне. В рутината за изтегляне се създава мениджър на контекста, който работи за около X секунди. След този брой секунди изтича срокът на действие на мениджъра на контекста X. След това използвайте функцията get () на сесията, която намира обекта за отговор.

Когато разработчикът създава атрибут за съдържание на обект за отговор, той връща aiohttp. StreamReader, който позволява на потребителя да изтегли файл с произволен размер. След като файлът бъде прочетен, той се записва на локалния диск. След това използвайте функцията response (), за да прекратите отговора. Според документацията, тя имплицитно извиква release (). Въпреки това асинхронното програмиране в Python е очевидно по-добро. По-добре е да оставите тази функция, за да предотвратите по-нататъшни проблеми. Има един раздел, който заключва раздел от кода, който се записва на диска, а кодът остава заключен. Използване на aiohttp - истински начин Подобряване на работния процес, при което на потребителите не се налага да прекарват време в създаване на сървър, качване на връзки и писане на асинхронни файлове, което намалява времето за създаване на проекти.

Асинхронното програмиране дава възможност за по-голяма ефективност на софтуера, тъй като потокът на изпълнение не се блокира за продължителни процеси или взаимодействие с потребителя, както при разработката на приложения за Node, така и за браузъри.

Статии по темата