Próbuję zrobić w czystym JavaScript wielowątkowosć za pomocą Workera według tych opisów:
http://blog.kamilbrenk.pl/web-workers-wielowatkowosc-w-javascript/
https://www.nafrontendzie.pl/wielowatkowy-javascript-web-worker
Doczytałem w Google, że wykorzystując URL.createObjectURL
da się uniknąć podłączania innego pliku (w zależności od potrzeb funkcja workera może być albo w tym samym, albo w osobnym pliku) i to działa, sam sprawdzałem.
Mam taki kod w ramach prób:
function WorkerDef()
{
this.ObiektWewnetrzny = [];
this.Przeksztalc = function(Obj)
{
for (var I = 0; I < Obj.length; I++)
{
Obj[I]++;
}
}
this.onmessage = function(Evt)
{
Obj:this.ObiektWewnetrzny = Evt.data.Obj;
this.Przeksztalc(this.ObiektWewnetrzny);
var OutMsg = this.ObiektWewnetrzny.join(",");
postMessage({Msg:OutMsg, Obj:this.ObiektWewnetrzny});
}
}
var JakisObiekt = [];
// Pewna funkcja wykonująca przekształcenie podanego obiektu
function Przeksztalc(Obj)
{
for (var I = 0; I < Obj.length; I++)
{
Obj[I]++;
}
}
var WorkerObj = new Worker(URL.createObjectURL(new Blob(["("+WorkerDef.toString()+")()"], {type: 'text/javascript'})));
WorkerObj.onmessage = function(Evt)
{
console.log("Obiekt wewnetrzny");
console.log(Evt.data.Obj);
console.log("Obiekt zewnetrzny");
console.log(JakisObiekt);
Przeksztalc(JakisObiekt);
Przeksztalc(JakisObiekt);
Przeksztalc(JakisObiekt);
console.log("Obiekt wewnetrzny");
console.log(Evt.data.Obj);
console.log("Obiekt zewnetrzny");
console.log(JakisObiekt);
}
function Start()
{
for (var I = 0; I < 10; I++)
{
JakisObiekt.push(I);
}
var InMsg = JakisObiekt;
console.log("Obiekt przed przeksztalceniem");
console.log(JakisObiekt);
WorkerObj.postMessage({Msg:InMsg,Obj:JakisObiekt});
}
- W jaki sposób sprawić, żeby
this.ObiektWewnetrzny
iJakisObiekt
wskazywał na jeden i ten sam obiekt (nie były to dwa różne obiekty)? - W jaki sposób i gdzie napisać funkcje
Przeksztalc
, aby jeden i ten sam kod mógł zadziałać zarówno nathis.ObiektWewnetrzny
, jak i naJakisObiekt
? - W jaki sposób za pomocą
postMessage
przekazać obiekt jako taki, a nie tekst w formacie JSON, który obrazuje obiekt (przy dużych obiektach może to mieć znaczenie wydajnościowe)?