Ответ 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 в целом.