Несколько процессов работают без сбоев, так зачем нам нужен web worker на javascript?

#javascript #html

#javascript #HTML

Вопрос:

Я смущен использованием и преимуществами web workers. Я смог создать две кнопки, которые запускают два счетчика, и значения обоих счетчиков отображаются на экране. Также я создал движение мяча для создания анимации. Код выглядит следующим образом:

 <!DOCTYPE html>

<html>
<head>
<style>
    @keyframes ballmovement {
        0% {
            left: 0px;
            top: 0px;
            background-color: yellow;
        }

        33% {
            margin-left: 100px;
            margin-top: 160px;
        }

        66% {
            margin-left: 200px;
            margin-top: 0px;
        }

        100% {
            margin-left: 300px;
            margin-top: 160px;
            background-color: purple;
        }
    }

    .animate {
        animation-name: ballmovement;
        animation-duration: 3s;
        animation-iteration-count: 40;
        animation-direction: alternate;
    }

    #ball {
        width: 100px;
        height: 100px;
        border-width: 2px;
        border-color: black;
        border-style: solid;
        border-radius: 50%;
    }
    #container {
        float: left; 
        height: 500px; 
        width: 50%; 
    }
    #bus {
    display: inline; 
    }
</style>
<script> 
    function startWorker1() {
        i = 0; 
        timedCount1();
    }

    function startWorker2() {
        j = 0;
        timedCount2();
    }

    function timedCount1() {
        i = i   1;
        document.getElementById("result1").innerHTML = i;
        setTimeout("timedCount1()", 500);
    }
    function timedCount2() {
        j = j   1;
        document.getElementById("result2").innerHTML = j;
        setTimeout("timedCount2()", 500);
    }

function stopWorker() {
    w.terminate(); 
    w = undefined; 
}


</script>
</head>
<body>
    <div id="container">
        <div id="ball" class="animate"></div>
    </div>
    <div id="bus">
    <button onclick="startWorker1()">Start Worker 1</button> 
    <button onclick="startWorker2()">Start Worker 2</button> 
    <button onclick="stopWorker()">Stop Worker</button>
    <div id="result1"></div>
    <div id="result2"></div>
    </div>
</body>
</html> 
  

Код работал действительно гладко, и ни один процесс не нарушал другой процесс.

Поскольку я создал в приведенном выше коде три процесса, которые работают параллельно, зачем нам нужны web worker?

Комментарии:

1. Для выполнения более сложных вычислений, не связанных с пользовательским интерфейсом?

2. веб-воркеры полезны для кода, требующего веб-воркеров

3. Вы используете асинхронные функции setTimeout. На самом деле в вашем коде нет веб-воркеров. Веб-работники работают в фоновом режиме и не имеют доступа к DOM. Подробнее — Использование Web Workers

4. @ThisClark: В этом его суть: его код гладкий, и он не использовал web workers, так в чем же смысл web workers.

5. @ThisClark Рассмотрим этот сценарий. У меня есть кнопка, при нажатии на которую будет реализован бесконечный цикл javascript. Как вы думаете, это приведет к зависанию страницы?

Ответ №1:

Весь JavaScript, не относящийся к Web worker, в одном документе является однопоточным: он может использовать только один процессор на компьютере, и любая значительная непрерывная обработка приведет к засорению вкладки, препятствуя не только другим процессам JavaScript (*), но даже обновлению отображения, даже GIF-анимации. В вашем коде нет длительно работающих функций, поэтому вы не можете увидеть эффект.

Например, попробуйте это:

 function naiveFibonacci(n) {
  if (n <= 2) return 1;
  return naiveFibonacci(n - 1)   naiveFibonacci(n - 2);
}
s.addEventListener('click', evt => r.textContent = `is ${naiveFibonacci(parseInt(n.value))}`);  
 Naive Fibonacci of: <input id="n"><button id="s">Go</button> <span id="r"></span>
<img src="https://upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif">  

На моем компьютере naiveFibonacci(42) занимает около 2 секунд. Не набирайте слишком много, иначе панель вашего браузера выйдет из строя; если вы опуститесь слишком низко, вы просто можете пропустить эффект. Вы заметите, что вращающийся GIF-файл будет приостановлен во время выполнения вычисления.

Замена непрерывных вычислений на тайм-ауты, чтобы они могли дать браузеру некоторую передышку, хотя и тривиальна в данном случае, не тривиальна в общем случае, поэтому, хотя это было необходимо до Web worker, это не идеально. Выгрузка длинных вычислений веб-воркерам — это сценарий, для которого они предназначены.


*) общие «процессы», как в «материале, который должен выполняться», а не технические «процессы», как в «экземплярах выполняемой компьютерной программы»

Комментарии:

1. Немного странно говорить «весь Javascript однопоточный» в вопросе, в котором говорится о веб-разработчиках, которые явно являются дополнительными потоками выполнения. Вы могли бы улучшить эту формулировку. Существует несколько потоков. Вам просто нужно жить в рамках ограничений WebWorker, чтобы иметь дополнительные потоки.

2. Тогда почему мой код в теле моего вопроса не заморозил домашнюю страницу? Считается ли вычисление счетчика длительным, потому что он будет продолжать подсчет?

3. Увеличение переменной, изменение текста в DOM и планирование новой задачи занимает очень мало времени. Нет, они не работают долго. У вас нет ни одной задачи, которая продолжает выполняться: у вас есть большое количество очень коротких задач, каждая из которых завершается почти немедленно. Это то, с чем обычный JavaScript справляется очень хорошо, веб-воркеры не нужны.

4. март 2018 — Chrome v.65 — GIF не зависает. вы, сэр, обманщик. 1.