Может ли JavaScript запускать несколько функций одновременно?

1

Можно ли одновременно вызвать несколько функций?

Например

var executed = false;
// loop 1
func();
// loop 2
func();

function func(){
    if (executed) return;
    executed = true;
    alert(1);
}

Может ли func() выполняться 2 раза одновременно?

Теги:
multithreading

4 ответа

1

JavaScript не имеет встроенной поддержки одновременного запуска нескольких функций. Это исторически зависело от трудоемких задач (таких как ожидание HTTP-запроса или интенсивного процессора), обрабатываемых с помощью собственного кода, который представляет API для JS (и этот API принимает обратный вызов или, что совсем недавно, возвращает Promise).

Это начинает меняться.

Большинство веб-браузеров поддерживают Web Workers, а Node.js внедрила экспериментальную поддержку Worker Threads.

Каждый из них позволяет обрабатывать JavaScript-код отдельному процессу, который выполняется независимо от основного цикла событий и связывается с основным процессом с использованием сообщений.

1

Никакой процессор, который я знаю, не может выполнять операторы одновременно. Большинство компьютеров имеют несколько процессоров, поэтому они могут запускать несколько операторов на нескольких процессорах. Таким образом, единственное возможное решение - это открыть браузер дважды, открыть ту же страницу и надеяться, что js будет выполняться параллельно (или использовать некоторые причудливые NodeJS или WebWorkers и т.д.).

Однако вместо того, чтобы запускать одно и то же время, его обычно очень быстро переключаться между двумя потоками, чтобы он выглядел как одно и то же время (называемое многозадачностью). Вы можете сделать это в js следующим образом:

var executed = false;
var theother=new Promise( r=>setTimeout(r,0));
func();
// loop 2
func();

async function func(){
if (executed) return;
await theother;
executed = true;
alert(1);
}

Или старый стиль (чтобы решить магию):

var executed = false;
// loop 1
func();
// loop 2
func();

function func(){
if (executed) return;
setTimeout(function(){
  executed = true;
  alert(1);
 },0);
}
0

Используйте ниже код

<!DOCTYPE html>
<html>
<head>
    <title>sample test</title>
    <script type="text/javascript">

        print=function(msg) {
            var ifunction=function(){
                console.log(msg);
            }
            return ifunction;
        };

        button1=function(name,count){
                for (var i =0 ;i <count; i++) {
                    setTimeout(print(name+":"+i+"seconds over after button1 click"),i*500);
                }
        };

    </script>
</head>
<body>
    <form>
        <input type="" name="" />
        <input type="button" value="button1" onclick="button1('button1',5)" />
        <input type="button" value="button2" onclick="button1('button2',5)" />
    </form>
</body>
</html>
0

Вы не можете этого сделать. Потому что JavaScript не поддерживает многопоточность. Каждая вкладка веб-браузера имеет только один интерпретатор и интерпретатор JavaScript в браузере - это один поток. См. Пример одного потока здесь.

См. Также этот ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню