http://www.elegio.it/omnia/js/lavoratore1-mio.html ... questo file in rete ...

Usando il Web Worker è possibile fare lunghi calcoli senza bloccare il PC e il browser.
Se questo esempio semplice di Web Worker funziona, avviandolo, genera a caso una matrice di ordine assegnato e la inverte etc...

Il file che rappresenta il Web Worker usato qui come esempio è questo: $lavoratore1.js.txt dove vengono fatte varie operazioni algebriche tra cui il calcolo della matrice inversa ( una funzione molto compatta anche se poco efficiente ).

Risultati del Web Worker:   

DA NOTARE: Internet Explorer 9 e precedenti versioni non accettano i Web Workers.


Il file usato che contiene il Web Worker e che ora si chiama $lavoratore1.js.txt è fatto in questo modo:

Importante, fondamentale, la funzione postMessage(calcolo) che invia i risultati del lungo calcolo, ( matrice di ordine assegnato e sua inversa ) del Web Worker.
//
// Ecco come va fatto il file del Web Worker 
// che spedisce, al file che lo attiva,
// i risultati ottenuti usando
// la function postMessage(calcolo)
//
//
// Riceve l'ordine dal file che attiva il Web Worker
//
var $calcolo=0;
var $ricevuto=-1,$attesa=1;
onmessage=function(eccoqua){
        $ricevuto=eccoqua.data }
//
// ================================================
//
// Operazioni algebriche tradizionali 
//
var $_1_={versione:20170619,br:"\u003cbr/\u003e"}
//
// Stampa un vettore
//
$_1_["vedov"]=function(ve){
    var k,n,ss=[];
    if(!Array.isArray(ve)) return ve;
    n=ve.length;for(k=0;n>k;k++){
       if(Array.isArray(ve[k])){
          ss[k]=$_1_.vedov(ve[k])}
       else{ss[k]=ve[k];}}
    return "["+ss.join(", ")+"]";
    }
//
// Stampa le matrici come tabelle per cui l'ordine
// di una matrice non puo' essere molto grande.
// Matrici piccole sono spesso usate nel calcolo
// tensoriale.
//
$_1_["vedom"]=function(ma){
    var j,n,sm;
    var xtab="\u003ctable border='1' style="+
        "'display:inline-block;vertical-align:middle'\u003e";
    var ytab="\u003c/table\u003e";
    var xtr="\u003ctr\u003e",ytr="\u003c/tr\u003e";
    var xtd="\u003ctd\u003e",ytd="\u003c/td\u003e";
    if(!Array.isArray(ma)){return "("+ma+")"}
    n=ma.length;
    for(j=0;n>j;j++){if(!Array.isArray(ma[j])){
           return $_1_.vedov(ma);}
       if(ma[j].length!=n){return $_1_.vedov(ma);}}
    sm=xtab;
    for(j=0;n>j;j++)sm+=xtr+xtd+ma[j].join(ytd+xtd)+ytd+ytr;
    return sm+ytab;
    }
//
// Traspone la matrice assegnata e fatta tradizionalmente
// usando due indici.
//
$_1_["traspmat"]=function(ma){
    var j,k,mr=[],n=ma.length;
    for(j=0;n>j;j++){mr[j]=[[]];
       for(k=0;n>k;k++)mr[j][k]=ma[k][j];}
    return mr;}
//
// Moltiplica tra loro due matrici tradizionali.
//
$_1_["matmul"]=function(ma,mb){
    var j,h,k,n,mm,mr=[];
    n=Math.min(ma.length,ma.length);
    for(j=0;n>j;j++){mr[j]=[[]];
       for(h=0;n>h;h++){mm=0;
           for(k=0;n>k;k++)mm+=ma[j][k]*mb[k][h];
           mr[j][h]=mm;} }
    return mr;}
//
// Calcola l'inversa di una matrice di ordine
// non molto elevato perche' questo algoritmo
// e' semplice ma piuttosto costoso:
//
$_1_["fainv"]=function(mat){
    var minore,xmino=function(mat,r,c){
       var j,jn=0,k,kn,id=[],ord=mat.length;
       for(j=0;ord>j;j++){if(j!=r){ kn=0;
           id[id.length]=[];
           for(k=0;ord>k;k++){
              if(k!=c){id[jn][kn]=mat[j][k];
                 kn++;} } jn++;} };
       return id; }
    var xdet=function(mat){
       var j,ord=mat.length,pm=1,dd=0;
       if(ord==1){dd=mat[0][0];
          return dd;};
       for(j=0;ord>j;j++){mm=xmino(mat,0,j);
          dd+=pm*mat[0][j]*xdet(mm);pm=-pm;}
       return dd; }
    var j,k,m,d,id=[],ord=mat.length;
    d=1/xdet(mat);
    for(j=0;ord>j;j++){m=d*(1-2*(j%2));
       id[id.length]=[];
       for(k=0;ord>k;k++){
          minore=xmino(mat,k,j);
          id[j][k]=m*xdet(minore);
          m=-m;} }
    return id;}
//
// Fa la combinazione lineare di due matrici tradizionali.
//
$_1_["mcomb"]=function(ca,ma,cb,mb){
     var j,k,md=[];
     var nd=Math.min(ma.length,mb.length);
     for(j=0;nd>j;j++){md[j]=[];
        for(k=0;nd>k;k++)md[j][k]=
          ca*ma[j][k]+cb*mb[j][k];}
     return md;}
//
// Fa la combinazione lineare di due vettori tradizionali
// senza dunque distinzione tra vettori covarianti e
// vettori controvarianti.
//
$_1_["vcomb"]=function(ca,va,cb,vb){
     var j,nd,vc=[];
     nd=Math.min(va.length,vb.length);
     for(j=0;nd>j;j++){
        vc[j]=ca*va[j]+cb*vb[j];}
     return vc;}
//
// Fa il prodotti di matrice per vettore entrambi
// tradizionali ( a due indici la matrice e con uno
// solo il vettore ).
//
$_1_["matvet"]=function(ma,ve){
     var j,k,vr=[],n=ma.length;
     for(j=0;n>j;j++){
       vr[j]=0;
       for(k=0;n>k;k++){
          vr[j]+=ma[j][k]*ve[k];}}
     return vr;}
//
// Fa il prodotto scalare di due vettori.
// In campo tensoriale uno dovrebbe essere 
// covariante e l'altro controvariante
// ossia uno premoltiplicato per un tensore metrico
// ma qui sono trattati in modo tradizionale.
//
$_1_["vetvet"]=function(vea,veb){
     var j,sca=0,n;
     n=Math.min(vea.length,veb.length);
     for(j=0;n>j;j++)sca+=vea[j]*veb[j];
     return sca;}
//
// Moltiplica le componenti del vettore per lo 
// scalare sc entrambi tradizionali.
//
$_1_["vesca"]=function(sc,ve){
     var j,vr=[],n=ve.length;
     for(j=0;n>j;j++)vr[j]=sc*ve[j];      
     return vr;}
// 
// Fa a caso un vettore
//
$_1_["vrandom"]=function(nor){
    var j,vr=[],n=Math.max(3,Math.round(nor));
    for(j=0;n>j;j++){
       vr[j]=Math.round(2000*Math.random())-1000;}
    return vr;
    }
// 
// Fa a caso una matrice
//
$_1_["mrandom"]=function(nor){
    var j,k,mr=[],n=Math.max(3,Math.round(nor));
    for(k=0;n>k;k++){mr[k]=[];for(j=0;n>j;j++){
       mr[k][j]=Math.round(2000*Math.random())-1000;}}
    return mr;
    }
// 
// Fa la somma dei valori assoluti di una matrice degli
// elementi diagonali e di tutti gli altri
//
$_1_["mabs"]=function(mt){
    var j,k,mab=0,dab=0,n=mt.length;
    for(k=0;n>k;k++){for(j=0;n>j;j++){
       if(k==j){dab+=Math.abs(mt[k][j])}
       else{mab+=Math.abs(mt[k][j])} } }
    return [dab,mab];
    }
//
function $fammi(nord){
   var vc,mc,mic,mid,asso,nd;
   nd=Math.min(10,Math.round(nord));
   nd=Math.max(nd,3);
   with($_1_){
     // Fa la matrice di ordine nd a caso:
     mc=mrandom(nd);
     postMessage([$calcolo,"Ha creato la matrice di "+
       "ordine "+nd+" Ci mette tanto a fare l'inversa !"]);
     mic=fainv(mc);
     mid=matmul(mc,mic);
     asso=mabs(mid);}
   return [0,") Ordine",nd,") Sommatoria I diag. ",asso[0],
           ") Sommatoria I non diag. "+asso[1]];
   }
//
function ContaPassi() {
    var calcolo;
    if(1>$ricevuto){
       setTimeout("ContaPassi()",$attesa);}
    else{$attesa=4000;
    calcolo=$fammi($ricevuto);
    calcolo[0]=$calcolo;
    $calcolo++;
    postMessage(calcolo);
    setTimeout("ContaPassi()",$attesa);}}
//
ContaPassi(); 
//

Per altre spiegazioni visitare questa pagina:

https://www.w3schools.com/html/html5_webworkers.asp
GMB
http://www.elegio.it/utili/
http://www.elegio.it/calcolatrice/trucchivari-201412.html
http://www.elegio.it/utili/caratteri-unicode.html
http://www.elegio.it/mp3/
http://www.elegio.it/mp3/musicaluna.html
http://www.elegio.it/stelle/punta_astri-oggettone.html
http://www.elegio.it/omnia/ht/usare-numeri-complessi.html