Почему JavaScript не поддерживает многопоточность? - PullRequest
239 голосов
/ 02 сентября 2008

Это преднамеренное дизайнерское решение или проблема с нашими современными браузерами, которая будет исправлена ​​в следующих версиях?

Ответы [ 17 ]

1 голос
/ 02 сентября 2008

Это реализации, которые не поддерживают многопоточность. В настоящее время Google Gears предоставляет способ использовать некоторую форму параллелизма, выполняя внешние процессы, но это все.

Новый браузер, который Google должен выпустить сегодня (Google Chrome), выполняет некоторый код параллельно, разделяя его в процессе.

Основной язык, конечно, может иметь такую ​​же поддержку, как, скажем, Java, но поддержка чего-то вроде параллелизма Эрланга далеко не за горизонтом.

0 голосов
/ 11 февраля 2017

Однако вы можете использовать функцию eval для обеспечения параллелизма В НЕКОТОРЫХ РАСШИРЕНИЯХ

/* content of the threads to be run */
var threads = [
        [
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');"
        ],
        [
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');"
        ]
    ];

window.onload = function() {
    var lines = 0, quantum = 3, max = 0;

    /* get the longer thread length */
    for(var i=0; i<threads.length; i++) {
        if(max < threads[i].length) {
            max = threads[i].length;
        }
    }

    /* execute them */
    while(lines < max) {
        for(var i=0; i<threads.length; i++) {
            for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) {
                eval(threads[i][j]);
            }
        }
        lines += quantum;
    }
}
0 голосов
/ 11 сентября 2016

Многопоточность с javascript явно возможна при использовании веб-мастеров HTML5.

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

Существует множество фреймворков, позволяющих структурировать программирование между потоками, среди них OODK-JS, фреймворк OOP js, поддерживающий параллельное программирование. https://github.com/GOMServices/oodk-js-oop-for-js

0 голосов
/ 02 сентября 2008

Согласно этой статье уже возможно реализовать многопоточность JavaScript.

0 голосов
/ 08 марта 2010

Без надлежащей языковой поддержки для синхронизации потоков даже не имеет смысла пробовать новые реализации. Существующие сложные приложения JS (например, что-либо, использующее ExtJS), скорее всего, неожиданно завершат работу, но без ключевого слова synchronized или чего-то подобного, будет также очень трудно или даже невозможно написать новые программы, которые ведут себя правильно.

0 голосов
/ 09 декабря 2018

вы можете использовать Jetworker, упаковщик на веб-работника https://github.com/uxitten/jetworker

0 голосов
/ 02 сентября 2008

Насколько я слышал, в Google Chrome будет многопоточный JavaScript, поэтому это проблема "текущих реализаций".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...