Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Web Workers - возможна ли передача в поток строки кода JS (https://javascript.ru/forum/misc/44629-web-workers-vozmozhna-li-peredacha-v-potok-stroki-koda-js.html)

javandernufirzam 27.01.2014 12:37

Web Workers - возможна ли передача в поток строки кода JS
 
почитал пару статей на тему WW
и понял что создается поток так:

var worker = new Worker('worker.js');

в конструктор передается адрес скрипта


вопрос - можно ли конструктору передавать полный текст скрипта -
new Worker('скрипт')
new Worker(eval(x))

смысл в том что есть задача генерировать код для потоков программно, без обращения к файловой системе и к серверу
без использования статического когда js например уже загруженного в теле документа

Яростный Меч 27.01.2014 13:03

можно сделать Blob и передать на него ссылку.

https://developer.mozilla.org/en-US/...ng_web_workers

параграф Embedded workers

kobezzza 27.01.2014 13:11

https://github.com/padolsey/operative

javandernufirzam 27.01.2014 13:16

спасибо товарищи. но мне надо понятнее и на русском, чтобы самому сделать а не изучать чужие фреймворки

Яростный Меч 27.01.2014 13:27

Цитата:

Сообщение от javandernufirzam
чтобы самому сделать

var code = 'postMessage(123);';
var blob = new Blob([code],{type: "text/javascript"});
var ref = URL.createObjectURL(blob);
var worker = new Worker(ref);
worker.onmessage = function (oEvent) {
    alert("data from worker: " + oEvent.data);
};
URL.revokeObjectURL(ref);

javandernufirzam 27.01.2014 13:39

спасибо. но вторую половину не понял, строки 4-8
поясни пожста чо это

Яростный Меч 27.01.2014 14:00

Цитата:

Сообщение от javandernufirzam
но вторую половину не понял, строки 4-8

4 - создается воркер по тому "урлу", который внутри себя неким образом содержит строку с кодом.
5-7 - механизм обмена данными с воркером, здесь он для демонстрации работы и к теме отношения не имеет.
8 - убиваем ссылку на блоб, чтобы не повисла и не было утечек памяти.

Яростный Меч 27.01.2014 14:02

тут основная идея как раз в строках 2-3, для их осознания раскури html5 FileAPI

javandernufirzam 27.01.2014 14:05

var code = 'postMessage(123);';
var blob = new Blob([code],{type: "text/javascript"});
var ref = URL.createObjectURL(blob);
var worker = new Worker(ref);
.....
URL.revokeObjectURL(ref);


- то есть такова обязательная последовательность


спасибо

javandernufirzam 27.01.2014 14:20

Цитата:

Сообщение от Яростный Меч (Сообщение 294342)
тут основная идея как раз в строках 2-3, для их осознания раскури html5 FileAPI

понял

но ничож более знать-то не надо для запуска и работы в таком режиме ?
я могу просто вставить такой кусок кода и всё - готовое решение ? не ?

Яростный Меч 27.01.2014 14:32

Цитата:

Сообщение от javandernufirzam
я могу просто вставить такой кусок кода и всё - готовое решение

в принципе да, должно работать
function workerFromCode(code) {
   var blob = new Blob([code],{type: "text/javascript"});
   var ref = URL.createObjectURL(blob);
   var worker = new Worker(ref);
   URL.revokeObjectURL(ref);
   return worker;
}


Цитата:

Сообщение от javandernufirzam
скажи что такое Blob пжста

основная сущность FileAPI, для различных целей.
содержит внутри себя массив байтов. Может быть отправлен на сервер через XHR, сохраняться в FileSystem, либо применяться как источник данных (вместе с URL createObjectURL/revokeObjectURL) для src картинок, фреймов, href ссылок - т.е. вместо ссылки на серверный http-ресурс

javandernufirzam 27.01.2014 14:35

спасибо!

если знаком с многопоточным программированием на десктопе - скажи, какая разница есть принципиальная

Яростный Меч 27.01.2014 14:57

Цитата:

Сообщение от javandernufirzam
если знаком с многопоточным программированием на десктопе - скажи, какая разница есть принципиальная

принципиальная - нет объектов синхронизации, таких как мютексы, критические секции и прочие семафоры.

воркеры - это чисто вычислительные потоки, лишенные доступа к UI. для взаимодействия с UI они используют очередь сообщений основного потока, закидывая туда команды функцией postMessage и получая оттуда команды через onmessage - этот механизм эквивалентен виндовой "очереди сообщений", в которую попадают события для окон.

kobezzza 27.01.2014 15:04

Цитата:

Сообщение от Яростный Меч (Сообщение 294327)
var code = 'postMessage(123);';
var blob = new Blob([code],{type: "text/javascript"});
var ref = URL.createObjectURL(blob);
var worker = new Worker(ref);
worker.onmessage = function (oEvent) {
    alert("data from worker: " + oEvent.data);
};
URL.revokeObjectURL(ref);

Удобнее использовать toString у функций.

function foo() {
    ...
}

var blob = new Blob([foo.toString()], {type: "text/javascript"});

javandernufirzam 27.01.2014 15:11

Цитата:

Сообщение от Яростный Меч (Сообщение 294359)
принципиальная - нет объектов синхронизации, таких как мютексы, критические секции и прочие семафоры.

- вот я об этом.
отсутствие перечисленных штуковин чего лишает меня в жизни?

что я без них совсем не смогу сделать и жизнь моя на десктопе будет печальной
то есть если я на десктопе обойдусь архитектурой из js

Цитата:

Взаимодействие c помощью передачи сообщений: на каждом процессоре многопроцессорной системы запускается однопоточный процесс, который обменивается данными с другими процессами, работающими на других процессорах, с помощью сообщений. Процессы создаются явно, путем вызова соответствующей функции операционной системы, а обмен сообщениями - с помощью библиотеки (например, реализация протокола MPI), или с помощью средств языка (например, High Performance Fortran, Erlang или occam). Обмен сообщениями может происходить асинхронно, либо c использованием метода «рандеву», при котором отправитель блокирован до тех пор, пока его сообщение не будет доставлено. Асинхронная передача сообщений может быть надёжной (с гарантией доставки) либо ненадёжной[3].
Параллельные системы, основанные на обмене сообщениями, зачастую более просты для понимания, чем системы с разделяемой памятью, и обычно рассматриваются как более совершенный метод параллельного программирования. Существует большой выбор математических теорий для изучения и анализа систем с передачей сообщений, включая модель акторов и различные виды исчислений процессов.

Яростный Меч 27.01.2014 15:27

Цитата:

Сообщение от javandernufirzam
отсутствие перечисленных штуковин чего лишает меня в жизни?

что я без них совсем не смогу сделать и жизнь моя на десктопе будет печальной
то есть если я на десктопе обойдусь архитектурой из js

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

javandernufirzam 27.01.2014 15:35

получается - js в плане вычислений и интерфейса не уступает дестктопным приложениям ??

Яростный Меч 27.01.2014 15:58

Цитата:

Сообщение от javandernufirzam
получается - js в плане вычислений и интерфейса не уступает дестктопным приложениям ??

Про вычисления - может уступать по скорости (по крайней мере, вряд ди JS будет выполняться быстрее С++).

Насчет интерфейса - да, в современных браузерах не уступает (тут скорее надо говорить о html и особенно css), ну кроме всяких там иконок в трее и т.п. А вообще этот момент холиварный, и на форумах вроде "просто треп" (на sql.ru) всегда вызывает срач до потолка :)

у веб-интерфейса основные недостатки - слабая поддержка устройств (типа сканера), буфера обмена, и прочих системных штук.

kobezzza 27.01.2014 16:45

Цитата:

Сообщение от javandernufirzam (Сообщение 294368)
получается - js в плане вычислений и интерфейса не уступает дестктопным приложениям ??

WebWorkers API не является часть JS - это внешнее API браузера, например в Node.js их нет. А уступает не уступает надо сравнивать с конкретной реализацией конкретного языка.

javandernufirzam 27.01.2014 17:17

здесь я говорю не о сферическом js в вакууме, а о связке технологий, хтмл5

это сложившийся фундамент веб приложений, ассемблер

kobezzza 27.01.2014 17:20

Цитата:

Сообщение от javandernufirzam (Сообщение 294396)
здесь я говорю не о сферическом js в вакууме, а о связке технологий, хтмл5

это сложившийся фундамент веб приложений, ассемблер

JS активно юзается на стороне сервера (Node.js) и как скриптовый язык для различных приложений (продукты Adobe например), так что никаких сферических коней.

javandernufirzam 27.01.2014 17:29

сомневаюсь я что нода это верный путь развития человечества...


Часовой пояс GMT +3, время: 14:18.