На первый взгляд, параллельная обработка звучит как приглашение на бесплатный обед - возможность использовать многоядерные процессоры более эффективно должны дать ваш код огромной скоростью. Практический опыт показывает, что это не всегда так: некоторые проблемы невозможно распараллелите. В дополнение к этому, параллельное исполнение приводит к целую семью новых проблем, которые не видели на односных машинах.
Параллельный код может, в принципе, быть разбитым на две группы работы. Первая группа - это классическая скорость увеличения - если ваша программа должна просеять через 3000 изображений, разделение работы означает, что можно обрабатывать больше изображений в любое время. В то время как определенно выгодно, эта задача редко встречается в повседневной веб-разработке. (Если вы создаете Heake Image Site, убедитесь, что вы обратно их прилично облачное хранилище ).
Более распространенная форма работы параллелизма работает вокруг долгосрочных задач, которые не требуют много времени процессора. Хорошим примером для этого будет ждать загрузку или какого-либо ввода устройства: если это сделано в параллельном моде, остальная часть GUI не должна быть заблокирована. Учитывая, что пользователи имеют тенденцию к пониманию «Почему кнопка не нажимает», это может привести к увеличению удовлетворенности пользователя, даже если фактическая скорость не увеличивается.
Если вам нужны новые ресурсы, чтобы помочь вам Code Smarter, ознакомьтесь с нашим руководством к лучшему Инструменты веб-дизайна 2019 года. Если вы хотите полностью избежать кода, спроектируйте свой сайт лучшим Строитель сайта и убедитесь, что вы выбрали идеальный веб хостинг Сервис с нашим руководством.
Var Sleep = требуют («сон»);
Функциональный работник () {
Console.log («Working Up»)
Sleep.msleep (1000)
console.log («работник вниз»)
}
SetInterval (работник, 2000);
в то время как (1 == 1)
{
Sleep.msleep (250)
Console.log («Привет от главного»)
} & gt;
Давайте начнем с небольшим примером на основе любимой любимой: setinterval. функция. Требуется ссылка на функцию и числовое значение, разграниченное в миллисекундах. После этого функция периодически выпускается всякий раз, когда истекает задержки таймера.
NPM Установка сна
NPM Example1.js
С использованием спать() Функция требует, чтобы мы загрузили модуль сна в локальный проект NPM. Он действует как интерфейс к библиотеке сна операционной системы - не задавайся вопросом, будет ли компилятор вашей рабочей станции включен во время развертывания пакета.
При запуске этой программы вы обнаружите, что вы столкнулись с выходом, аналогичным, как показано на рисунке, сопровождающему этот шаг. Очевидно, что наш работник никогда не вызывает - что-то должно быть не так с функцией SetInterval.
Современные браузеры оснащены каждой вкладкой с одной нитью JavaScript. Тщательный взгляд на наш цикл показывает, что он бесконечно. Это означает, что он будет работать навсегда, и никогда не будет давать контроль. При условии setinterval () Работает с сообщением, его полезная нагрузка никогда не запускается, поскольку обработчик сообщений заблокирован от работы.
const bar = () = & gt; console.log ('Bar')
const baz = () = & gt; Console.log ('baz')
const foo = () = & gt; {
console.log ('foo')
Setimeate (бар, 0)
Баз ()
}
foo ()
Блог Flavio Copes's ' обеспечивает чрезвычайно интересный бит кода, иллюстрирующего проблему. При запуске он дает вывод, показанный на рисунке из-за блокировки очереди сообщений до foo () Отказ от контроля над основным потоком.
Учитывая, что базовая операционная система способна выполнять упреждающую многозадачность, давайте использовать его возможности нерестами потоками через выделенные API под названием WebWorkers, которые наслаждаются широкой поддержкой. Фигура, сопровождающая этот шаг, показывает Текущий список для функции.
Console.log («Работник говорит привет!»);
Console.log («работник вверх»);
в то время как (1 == 1)
{
Console.log («X»);
}
WebWorkers не могут отключить с помощью полезной нагрузки функции. Вместо этого требуется новый файл, который содержит код, предназначенный для запуска в потоке. В случае нашего примера, example7thread.js. Содержание показано сопровождающим этот шаг.
const рабочий = требует ('works_threads');
var myworker = новый рабочий. Worker ('./
example7Thread.js ');
var myworker2 = новый рабочий. Worker ('./
example7Thread.js ');
Наш работник готов к первому времени. Специальности Node.js runtime заставляет нас включать модуль рабочих потоков и пропуск в относительном пути - проблемы, не сталкивающиеся в браузере. Кроме того, не задавайся вопросом о Отсутствует начало () Позвоните - веб-работник устанавливается, когда экземпляр наступит в Интернет.
Доставка сообщений обычно требует некоторого взаимодействия между временем выполнения и остальной частью операционной системы. К сожалению, наша бесконечная петля блокирует этот процесс - что означает, что только одно из сообщений всплывает перед «большим стойлом».
const рабочий = требует ('works_threads');
var myworker = новый рабочий. Worker ('./
example7Thread.js ');
var myworker2 = новый рабочий. Worker ('./
example7Thread.js ');
в то время как (1 == 1)
{
}
Другой эксперимент включает в себя размещение пустой петли после двухконструкций конструктора. В этом случае темы никогда не начнут работать - сообщение вызова никогда не приходит к операционной системе.
Хотя работники, работающие на жестких бесконечных петель, имеют выставленные выше проблемы, процедуры могут общаться друг с другом. Это делается через сообщение, передающее интерфейс - подумайте о нем как объект, который позволяет пройти объект сообщения от отправителя к реципиенту по границам нити.
В дополнение к преимуществам возможность координации потоков E FF устойчиво (и снизить риск «столкновения», также известных как условия расы), сообщение, передавающее в основную нить, является единственным способом взаимодействия с DOM, из-за Di FF Cology Безопасные потоки стеки GUI.
Реализация сообщения, проходящего в Node.js утомительно. Переместите код в Интернет - начните, создавая жгут HTML, которые загружаются examplempi.js. Отказ Имейте в виду, что этот код может быть запущен только с веб-сервера localhost из-за ограничений о происхождении DOM.
var myworker = новый работник ('./
ExamplempithRead.js ');
var myworker2 = новый рабочий ('./
ExamplempithRead.js ');
myworker.onmessage = Функция (E)
{
console.log (e);
}
myworker2.onmessage = Функция (E)
{
console.log (e);
}
Каждый работник обнажает свойство OnMessage, который занимает ссылку на функцию, которая должна быть вызвана всякий раз, когда сообщение появляется с другого конца. Входящие сообщения просто пересылаются на консоль браузера из основного потока.
Postmessage («Работник говорит привет!»);
PostMessage («работник вверх»);
в то время как (1 == 1)
{
PostMessage («X»);
}
Отправка сообщений на почтовый ящик достигается путем вызова функции сообщения сообщения. Имейте в виду, что работник также может реализовать onmessage. Событие, которое может получать информацию от того, кто «владеет» объектом инстанции работника.
На данный момент в течение времени код готов к запуску. Консоль разработчиков не затоплен сообщениями из-за высокой целевой целесообразности интерфейса MPI, что означает, что данные могут ездить по системе E FF устойчиво.
Добавление Microsoft Async и await ключевых слов изменена история C # и VisualBasic.net. В принципе, метод, обозначенный Async, работает совместно с остальной частью программы. Результаты могут быть собраны через функцию ждут.
const sleep = (milliseconds) = & gt; {
вернуть новое обещание (разрешение = & gt;
Settimeate (разрешение, миллисекунды))
}
Учитывая, что браузеры находятся под тяжелыми ограничениями, когда речь идет о доступе к родным функциям, мы не можем повторно использовать функцию сна, упомянутой ранее. Кроме того, это, кроме того, в том, что он остановил весь odd.js во время выполнения. Спипка, сопровождающий этот шаг, обеспечивает более эффективный подход.
Этот код возвращает объект обещания - это еще один класс удобства, добавленный в Java Script в попытке сделать многопоточность проще. Вам нужно будет вызвать его метод разрешения через сентиментальный Обеспечивая, что код должен «сидеть» довольно много времени.
Ждут вызовы разрешены только внутри асинковых функций. Это означает, что работник нуждается в перезаписи - начните выключить, вызывая функцию предъявителя Async. Он обрабатывает остальную часть взаимодействия кода.
const sleep = (milliseconds) = & gt; {
вернуть новое обещание (разрешение = & gt;
Settimeate (разрешение, миллисекунды))
}
PostMessage («Работник говорит привет!»);
PostMessage («работник вверх»);
работник ()
Async Function Worker () {
в то время как (1 == 1)
{
PostMessage («X»);
ждут сон (1000);
}
}
Разработчики, работающие на код Node.js, не должны забывать, что они могут - обычно - также создают совершенно родные модули, если требуется чрезвычайно высокая производительность. Они могут не только воспользоваться различными API в операционной системе, но также можно записать в языках программирования, которые компилируют машинный код.
Эта статья была первоначально опубликована в номере 291 журнала Creative Web Design Веб-дизайнер Отказ Купить проблему 291. Отказ
Прочитайте больше:
(Образ кредита: Ян из Песелей) Пытаясь выбрать имя сайта? Это одн�..
(Кредит на изображение: Bulma) Хотите начать использовать Bulma? Ты в �..
Независимо от того, просто начинаете ли вы в графическом дизайне или заправочном Pro, всегда есть что-то н�..
Если вы чувствуете себя застрявшим в творческой колею, это может стоит..
Я начал использовать Cinema 4D через несколько месяцев после получения мо�..
Добраться до захвата с Теория цвета может показаться немного слишком похожем на изучение матем�..
В 1999 году я построил свой первый веб-сайт, используя веб-студию 1.0. Веб-студия была графическим пользоват�..
(Образ кредита: Роберт Пиццо) Сверхрусенний режиссер Дэн Молл..