Многоядерное программирование с использованием JavaScript?

Итак, у меня есть эта рекурсивная функция, которую я хотел бы использовать с моим кодом. Проблема в том, что на самом деле он не использует преимущества двухъядерных машин, потому что js является однопоточным. Я пробовал использовать веб-мастеров, но не очень много знаю о многоядерном программировании. Кто-нибудь укажет мне на какой-то материал, который мог бы объяснить, как это делается. Я googled, чтобы найти эту образец ссылки, но это не очень помогает без документации!=/

Я был бы рад, если бы кто-нибудь мог показать мне, как это можно сделать без веб-мастеров! Это было бы просто потрясающе! =)

Я наткнулся на эту ссылку на whatwg. Это действительно странно, потому что он объясняет, как использовать многоядерное программирование в веб-мастерах и т.д., Но при выполнении в моем браузере Chrome он вызывает ошибки. То же самое происходит с другими браузерами.

Ошибка: 9Uncaught ReferenceError: Работник не определен в worker.js

Ответы

Ответ 1

Написав это с головы, нет гарантий для исходного кода. Пожалуйста, успокойся.

Насколько я знаю, вы действительно не можете программировать потоки с JavaScript. Работники Сети - это форма многопрограммного программирования; но JavaScript по своей природе является однопоточным (на основе цикла событий).

Пользователь веб-сайта представляет собой отдельный поток выполнения в том смысле, что он не имеет ничего с script, который запустил его; нет ссылки на глобальный объект script (обычно называемый "окном" в браузере) и не ссылается ни на одну из ваших основных переменных script, кроме данных, которые вы отправляете в поток.

Подумайте, как веб-рабочий, как маленький "сервер", который задает вопрос и дает ответ. Вы можете отправлять строки только на этот сервер, и он может только разобрать строку и отправить обратно то, что она вычислила.

// in the main script, one starts a worker by passing the file name of the 
// script containing the worker to the constructor. 
var w = new Worker("myworker.js");

// you want to react to the "message" event, if your worker wants to inform
// you of a result. The function typically gets the event as an argument. 
w.addEventListener("message",
    function (evt) {
        // process evt.data, which is the message from the 
        // worker thread
        alert("The answer from the worker is " + evt.data);
    });

Затем вы можете отправить сообщение (String) в этот поток с помощью метода postMessage() - Method:

w.postMessage("Hello, this is my message!");

Образец рабочего script (сервер "эхо" ) может быть:

// this is another script file, like "myworker.js"
self.addEventListener("message", 
    function (evt) {
        var data = JSON.parse(evt.data);
        /* as an echo server, we send this right back */
        self.postMessage(JSON.stringify(data))
    })

все, что вы публикуете в этом потоке, будет декодировано, перекодировано и отправлено обратно. конечно, вы можете делать любую обработку, которую вы хотели бы сделать между ними. Этот рабочий останется активным; вы можете вызвать terminate() на нем (в вашем основном script, который был бы w.terminate()), чтобы закончить его или вызвать self.close() у вашего рабочего.

Подводя итог: что вы можете сделать, это закрепить свои функциональные параметры в строке JSON, которая отправляется с помощью postMessage, декодируется и обрабатывается "с другой стороны" (у рабочего). Результат вычислений будет отправлен обратно на ваш "основной" script.

Чтобы объяснить, почему это не проще: больше взаимодействия на самом деле невозможно, и это ограничение является намеренным. Поскольку общие ресурсы (объект, видимый как для рабочего, так и для основного script), будут подвержены двум потокам, мешающим им в одно и то же время, вам нужно будет управлять доступом (то есть блокировкой) к этому ресурсу, чтобы предотвратить гонки условия.

Метод передачи сообщений, общий доступ не так хорошо известен, потому что большинство других языков программирования (например, C и Java) используют потоки, которые работают в одном и том же адресном пространстве (в то время как другие, например, Erlang, например, нет). Рассмотрим это:

  • действительно сложно кодировать более крупный проект с помощью мьютексов (механизм взаимного исключения) из-за связанных с этим сложностей с условиями тупика/гонки. Это материал, который может заставить взрослых людей плакать!
  • Это действительно легко по сравнению с сеансом передачи сообщений, shared-nothing. Код изолирован; вы точно знаете, что входит в ваш рабочий, и что получается из вашего рабочего. Тупики и условия гонки невозможно для достижения!

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

NB. Мне просто сообщили, что по крайней мере некоторые реализации будут обрабатывать JSON-кодирование сообщений для вас.

Итак, чтобы дать ответ на ваш вопрос (все выше, версия tl; dr): Нет, вы не можете сделать это без веб-работников. Но нет ничего плохого в веб-работниках помимо поддержки браузера, как в случае с HTML5 в целом.