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)

Яростный Меч 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

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


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