Domanda

Sto scrivendo un server di gioco in node.js e alcune operazioni comportano un forte calcolo da parte del server. Non voglio smettere di accettare connessioni mentre eseguo quei calcoli: come posso eseguirli in background quando Node.js non supporta i thread?

È stato utile?

Soluzione

Non posso garantire nessuno di questi, personalmente, ma se sei intenzionato a fare il lavoro in corso, ci sono state un paio di implementazioni indipendenti dell'API di Webworkers per il nodo, come elencato nella pagina dei moduli del nodo :

  • http://github.com/cramforce/node-worker
  • http://github.com/pgriess/node-webworker

A prima vista, il secondo sembra più maturo, e questi ti consentirebbero di fare essenzialmente la programmazione filettata, ma fondamentalmente è un modello attore, quindi è tutto fatto con il passaggio dei messaggi e non puoi avere strutture di dati condivise o altro.

Inoltre, per quello che vale, il team Node.js intende implementare esattamente questo api in modo nativo, alla fine, quindi questi strumenti, anche se non sono perfetti, potrebbero essere un tasto di sosta decente.

Altri suggerimenti

var spawn = require('child_process').spawn;
listorwhatev = spawn('ls', ['-lh', '/usr']);//or whatever server action you need

//then you can attach events to that list like this
listorwhatev.on('exit', function(code){});

///or in this ls example as it streams info
listorwhatev.stdout.on('data', function(info){sys.puts(info);});

Assicurarsi che il processo di spawn si verifichi una volta per applicazione, quindi alimenta le cose in esso e guardalo per eventi per connessione. Dovresti anche verificare che il listorchatev sia ancora in esecuzione prima di gestirlo. Dato che tutti amiamo quegli errori non insegnati nel nodo che si schiantano l'app, non noi;) quando lo spawn (PID) è uscito sebbene un'uccisione o qualcosa di brutto accade sulla tua macchina e non sei uscito dallo spawn nel tuo codice con grazia, il tuo Stream Event Handler si bloccherà la tua app.

e alcune operazioni comportano un forte calcolo su una parte del server

Come hai scritto un codice che è il calcolo pesante in primo luogo. È molto difficile da fare in node.js.

Come posso eseguirli in background quando node.js non supporta i thread

È possibile generare un paio di istanze di lavoratore (nodo) e comunicare con le connessioni accettabili (istanza del nodo) utilizzando ad esempio Redis Blocking Pop. La libreria Node.js Redis non è blocco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top