Sincrono vs codice Asincrono con Node.js

Stiamo lavorando con il nodo, soprattutto per un progetto interno e per comprendere il modo migliore per usare la tecnologia.

Non provenienti da un determinato asincrona sfondo la curva di apprendimento può essere una sfida, ma siamo sempre utilizzato per il quadro e il processo di apprendimento.

Una cosa che ha polarizzato noi è quando il momento migliore per utilizzare codice sincrono vs codice asincrono è. Stiamo attualmente utilizzando la regola che se qualcosa interagisce con IO poi deve essere asincrona tramite chiamata o effettua l’evento emettitore (questo è un dato di fatto), ma altri elementi che non sono in alcun modo usando IO può essere costruito come sincrona funzioni (questo dipende dalle pesantezza della funzione stessa e come il blocco è nella realtà), ma è questo l’approccio migliore da adottare quando si lavora con Node.js?

Per esempio, ci sono la creazione di un Hal+JSON builder, che attualmente esiste nel nostro codice di base. È sincrona, semplicemente perché tutto ciò che sta facendo è la creazione di alcuni piuttosto piccolo oggetto letterali e niente di più, non ci sono dipendenze esterne e certamente non IO farmacologiche.

È il nostro approccio per prendere o no?

InformationsquelleAutor Modika | 2012-12-13



3 Replies
  1. 18

    Diciamo che hanno due funzioni, foo e bar, che sono in esecuzione in modo sincrono:

    function foo() {
        var returnValue = bar();
        console.log(returnValue);
    }
    
    function bar() {
        return "bar";
    }

    Al fine di rendere l’API “asincrono” è cambiato per usare le richiamate:

    function foo() {
        bar(function(returnValue) {
            console.log(returnValue);
        });
    }
    
    function bar(callback) {
        callback("bar");
    }

    Ma il fatto della questione è, questo codice è ancora completamente sincrona. La callback viene eseguito lo stesso stack di chiamate, e non filettatura ottimizzazioni sono stati fatti, senza i vantaggi di scalabilità sono per essere avuto.

    Diventa quindi una questione di codice readablity e stile di codifica. Personalmente trovo la tipica var val = func(); tipo di codice più leggibile e comprensibile. L’unico inconveniente è che se un giorno avrebbe bisogno di modificare la funzionalità di bar così, che sarebbe necessario per eseguire alcune attività di I/O o chiamare qualche altra funzione che è asincrono, è necessario modificare le API di barcosì.

    Mio personali preferenza: uso tradizionale, synchnous modelli quando applicabile. Utilizzare sempre asincrona stile quando I/O è coinvolto o in caso di dubbio.

    • Penso che questo è vicino a dove siamo ora, utilizzando sincrono per fare piccoli oggetti e lasciando il async roba di i/O di elementi associati. Penso che anche nell’esempio del nostro generatore, si rende il senso di Sincronizzazione, al momento, non tocca I/O ed è attualmente in interno, ma se si decide di spostarlo in un separato modulo ci sarebbe eventualmente fare asincrono in modo che altri che lavorano come in grado di usarla in quel modo.
    • Come per il precedente, questo mi ha confermato che ci sono almeno sulla strada giusta con il nostro modo di pensare (insieme ad alcune altre risposte)
    • sì, non perdete tempo con CPS stile (async stile) a meno che non hai a che fare con la rete o I/o, etc.
    • Uhhh, la tua seconda funzione bar NON è asincrona. Esso utilizza una funzione di callback, ma è ancora sincrono. Proprio come array.forEach() utilizza una funzione di callback, ma è ancora in sincrono. Non sono sicuro di come questo ha ottenuto di essere accettato di rispondere con così tanti upvotes. È sbagliato.
    • grazie per il tuo feedback. Se leggi la frase successiva, in basso a destra il codice di esempio, vedrete che ci dice esattamente questo: “Ma il fatto della questione è, questo codice è ancora completamente sincrona […]”
  2. 3

    Svolta una funzione sincrona in asincrono utilizzando processo.nextTick() è un’opzione, ma quello che si dovrebbe usare solo se il software è il blocco per troppo tempo. Ogni volta che la funzione sincrona è in esecuzione nodo non è possibile fare nulla in quanto è un singolo thread. Questo significa che se la vostra applicazione è un server, non risponde.

    Prima di dividere qualsiasi funzione sincrona, vorrei consigliare di fare alcune analisi di benchmarking e di profilazione modo da poter prendere una decisione informata. Altrimenti si corre il rischio di dong prematuro ottimizzazione

    Vedi qui per una buona discussione https://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil

    Ecco come si può rendere la vostra funzione asincrona, nel senso che vi permetterà di nodo per fare altre cose http://howtonode.org/understanding-process-next-tick

  3. 1

    Non so cosa sia il “Hal+Json builder”, ma qui è quello che penso su NodeJS. Si dovrebbe scrivere il codice come asincrona possibile, spingendo ai limiti. La semplice ragione è che il codice asincrono mestieri prestazioni reattività, che è nella maggior parte dei casi più importanti.

    Naturalmente se certe operazioni sono molto veloci, quindi non c’è bisogno di codice asincrono. Si consideri, per esempio questo codice:

    var arr = []; //assume array is nonempty
    for (var i = 0, l = arr.length; i < l; i++) {
        arr[ i ].doStuff( );
    }

    Se arr è piccolo e doStuff è un’operazione veloce, allora si dovrebbe non perdere tempo a scrivere questo codice in maniera asincrona. Tuttavia, se si vuole un po di tempo, allora si dovrebbe considerare la scrittura come:

    var arr = []; //assume array is nonempty
    var process_array_element = function( ) {
        if (arr.length) {
            arr.pop().doStuff( );
            process.nextTick( process_array_element );
        }
    };
    process_array_element( );

    Ora, questo codice è veramente asincrona. Ci vorrà ancora più tempo per completare il lavoro, ma nel frattempo non bloccare tutto il server. Abbiamo scambiato le prestazioni per la reattività.

    Conclusione: dipende dalla tua situazione! 🙂

    • L’applicazione è un utilizzo di un Ipermedia API, che stiamo usando HAL+JSON come il tipo, quindi abbiamo bisogno di qualcosa per costruire le risposte, sembra più elaborato, allora è. Quello che vogliamo fare è di non ottimizzare prima dobbiamo, o anche di creare uno stile, se la sua non è giustificata, quindi, cercheremo sempre di Async qualcosa che è pesante o IO vincolato (ora o potrebbe essere in futuro), ma per i più piccoli, più veloci, non sono mai operazioni di i / o possiamo tranquillamente pompa fuori sync codice.

Lascia un commento