На перший погляд, паралельна обробка звучить як запрошення до безкоштовного обіду - можливість використовувати багатоядерний CPU, більш ефективно повинен дати ваш код величезної швидкості. Практичний досвід показує, що це не завжди так: деякі проблеми неможливо паралельно. На додаток до цього, паралельне виконання призводить до всієї родини нових проблем, які не розглядаються на одноядерних машинах.
Паралельний код може, в принципі, бути розбитим на дві групи роботи. Перша група - це класичне збільшення швидкості - якщо ваша програма повинна просіяти через 3000 зображень, розбиття роботи означає, що більше зображень можуть бути оброблені в будь-який час. Хоча, безумовно, корисний, такий вигляд рідко зустрічається в повсякденному веб-розробці. (Якщо ви створюєте важкий сайт зображення, переконайтеся, що ви повернутеся до пристойного хмара зберігання ).
Чим більш поширеною формою паралелізації роботи працює навколо довгострокових завдань, які не вимагають багато часу процесора. Хорошим прикладом для цього буде чекати завантаження або якийсь введення пристрою: якщо це зроблено в паралелеваній моді, решта графічного інтерфейсу не потрібно заблокувати. Враховуючи, що користувачі, як правило, мають проблеми з розумінням "чому кнопка не натискає", це може призвести до збільшення задоволеності користувачів, навіть якщо фактична швидкість не збільшується.
Якщо вам потрібні нові ресурси, щоб допомогти вам коду розумніше, перегляньте наш посібник до кращого Інструменти для веб-дизайну 2019. Якщо ви хочете, щоб уникнути коду взагалі, дизайн вашого сайту з кращими Веб-будівельник і переконайтеся, що ви обрали ідеальне веб хостинг Сервіс з нашим керівництвом.
Var Sleep = потрібно ("сон");
Функціональний працівник () {
Console.Log ("Worker UP")
сплячий (1000)
Console.Log ("Worker Down")
}
SetInterval (працівник, 2000);
в той час як (1 == 1)
{
сплячий (250)
Console.Log ("Привіт з головного")
} & gt;
Давайте почнемо з невеликим прикладом, що базується на улюбленому улюбленому: сетурний функція. Він приймає посилання на функцію, і числове значення, що виділяється в мілісекундах. Після цього функція періодично звільняється, коли закінчується затримка таймера.
NPM встановлює сон
npm example1.js
За допомогою Сон () Функція вимагає, щоб ми завантажили модуль сну до місцевого проекту NPM. Він діє як інтерфейс для бібліотеки сну операційної системи - не дивуватися, якщо компілятор вашої робочої станції звільняється під час розгортання пакета.
Під час запуску цієї програми ви опинитеся, зіткнувшись з виходом, подібним до того, що показаний на малюнку, що супроводжує цей крок. Очевидно, що наш працівник ніколи не називає - щось має бути неправильним з функцією SetInterVal.
Сучасні браузери обладнали кожну вкладку з однією ниткою JavaScript. Ретельний погляд на наш петля показує, що це нескінченно. Це означає, що воно буде працювати назавжди, і ніколи не буде контролювати. З урахуванням цього SetInterval () Працює з повідомленням, його корисне навантаження ніколи не запускається, оскільки обробник повідомлення заблоковано від запуску.
const bar = () = & gt; console.log ('бар')
const baz = () = & gt; console.log ('baz')
const foo = () = & gt; {
console.log ('foo')
attimideout (бар, 0)
Баз ()
}
foo ()
Блог Flavio Cofes , забезпечує надзвичайно цікавий біт коду, що ілюструє проблему. При запуску, він дає виведення, показану на малюнку, завдяки черзі повідомлення, яка заблокована до foo () відмовитися від контролю основної нитки.
Враховуючи, що основна операційна система здатна виконувати попереджувальну багатозадачність, дозвольте нам використовувати свої можливості за допомогою нерестних ниток за допомогою спеціального API, що називаються веб-працівниками, які користуються широкомасштабною підтримкою. Фігура, що супроводжує цей крок, показує Поточний список для функції.
console.log ("працівник каже привіт!");
Console.Log ("працівник");
в той час як (1 == 1)
{
console.log ("x");
}
WebWorkers не можуть викинути з функцією корисного навантаження. Замість цього потрібен новий файл, який містить код, призначений для запуску у потоці. У випадку нашого прикладу, excecient7thread.js Має вміст, що показує, що супроводжує цей крок.
Const Sporker = вимагає ('worker_threads');
var myworker = новий працівник. Робота ('./
excecum7.jss ');
var myworker2 = новий працівник. Робота ('./
.
Наш працівник готовий до первинного часу. Спеціальності Node.js Runtime змушують нас включити робочий режим модуля та проходять у відносний шлях - проблеми, що не стикаються у браузері. Крім того, не дивуйтеся Відсутній старт () Зателефонуйте - веб-працівник встановлюється, коли примірник з'являється в Інтернеті.
Доставка повідомлень зазвичай вимагає певної взаємодії між роботою та рештою операційної системи. На жаль, наша нескінченна петля блокує цей процес - це означає, що лише один з повідомлень з'являється перед "великим Stall".
Const Sporker = вимагає ('worker_threads');
var myworker = новий працівник. Робота ('./
excecum7.jss ');
var myworker2 = новий працівник. Робота ('./
excecum7.jss ');
в той час як (1 == 1)
{
}
Інший експеримент передбачає розміщення порожньої петлі після двох викликів конструктора. У цьому випадку нитки ніколи не почнуть працювати - повідомлення виклик ніколи не надходить з операційною системою.
Хоча працівники, що працюють щільні нескінченні петлі, мають виставлені вище проблеми, процедури можуть спілкуватися один з одним. Це робиться за допомогою повідомлення, що проходить повідомлення - подумайте про це як об'єкт, який дозволяє пройти об'єкт повідомлення від відправника до одержувача через межі нитки.
На додаток до переваг здатності координувати нитки e ff riently (і зменшити ризик "зіткнення", також відомий як умови перегонів), повідомлення, що проходить до основної нитки, є єдиним способом взаємодії з домом, завдяки діючому ICULTY, нитки-безпечні гілки.
Впровадження повідомлення, що проходить у вузлі. Перемістіть код до Інтернету - запустіть, створюючи HTML-утримання, що завантажує examplempi.js . Майте на увазі, що цей код може бути запущений тільки з веб-сервера Localhost через обмеження походження до DOM.
var myworker = новий працівник ('./
екзаменаційний;
var myworker2 = новий працівник ('./
екзаменаційний;
myworker.onmessage = функція (e)
{
console.log (e);
}
myworker2.onmessage = Функція (E)
{
console.log (e);
}
Кожен працівник виставляє властивість OnMessage, яка займає посилання на функцію, яка повинна бути викликана, коли повідомлення з'являється з іншого кінця. Вхідні повідомлення просто пересилаються до консолі браузера з основної нитки.
Постповідь ("працівник каже привіт!");
постсессада ("працівник");
в той час як (1 == 1)
{
поштове повідомлення ("x");
}
Надсилання повідомлень до поштової скриньки виконується шляхом виклику функції повідомлення повідомлення. Майте на увазі, що працівник також може реалізувати наносильник Подія, яка могла б отримувати інформацію від того, хто «власний» об'єкт інстанції працівника.
У цей момент код готовий до запуску. Консоль розробника не затоплена повідомленнями через високу E FF Messial інтерфейсу MPI, тобто дані можуть подорожувати по системі e ff riently.
Додавання Microsoft Async і очікує ключових слів, змінивши історію C # та VisualBasic.net. В принципі, метод, відзначений асинкою, виконується спільно з рештою програми. Результати потім можуть бути заготовлені через функцію очікування.
Const Sleep = (Milliseconds) = & GT; {
Поверніть нову обіцянку (Resolve = & GT;
attimideout (рішучість, мілісекунди))
}
Враховуючи, що браузери знаходяться під суворими обмеженнями, коли мова йде про доступ до рідних функцій, ми не можемо повторно використовувати функцію сну, згадану раніше. Це, крім того, є субоптимальним, що він зупинив весь вузол. Фрагмент, що супроводжує цей крок, забезпечує більш ефективний підхід.
Цей код повертає об'єкт обіцянки - це ще один клас зручності, доданий до сценарію Java у спробі зробити багатопоточне значення. Вам потрібно буде викликати метод вирішення через a настройка , забезпечення того, щоб код повинен «сидіти» досить трохи часу.
Чекайте дзвінки дозволяються лише усередині функцій Async. Це означає, що працівник потребує перезапису - запустіть, викликаючи функцію носія Async. Він обробляє решту взаємодії коду.
Const Sleep = (Milliseconds) = & GT; {
Поверніть нову обіцянку (Resolve = & GT;
attimideout (рішучість, мілісекунди))
}
постсесс ("працівник каже привіт!");
постсессада ("працівник");
працівник ()
Функція Async () {
в той час як (1 == 1)
{
поштове повідомлення ("x");
чекають сон (1000);
}
}
Розробники, що працюють на код Node.js, не повинні забувати, що вони можуть - зазвичай - також створюють абсолютно рідкі модулі, якщо потрібно надзвичайно висока продуктивність. Вони можуть не тільки користуватися різною операційною системою API, але також можуть бути написані мов програмування, які складають машинний код.
Ця стаття була опублікована у випуску 291 журналу Creative Web Design Веб-дизайнер . Купити проблему 291 .
Читати далі:
Кілька років тому художній директор Lucid Games попросив мене допомогти їм ..
Шари - це те, що дозволяють створити проект з ранніх основ до обробних д..
Є багато аспектів освітлення, які потрібно розглянути для того, щоб пе�..
(Image Credit: Jill Tisbury) Під час навчання Як намалювати тварин , �..
Adobe доручив мені створити ілюстрацію, щоб виразити концепцію багатохоцтва, і вище, ви можете побачити мо�..
Іноді повертаючись до основ, є життєво важливим, щоб залишитися на вер�..
Навчання Як малювати Портрет нелегкий, але є кілька кроків, як�..
Просять просять семінар з створення фантастичного середовища, я думав..