Guida allo sviluppo della guida

sincrono e asincrono

introduzione

Mentre le applicazioni Web continuano a crescere, JavaScript, un linguaggio di programmazione ampiamente utilizzato, continua a crescere ed evolversi. Nello sviluppo front-end Web, JavaScript viene utilizzato principalmente per l'elaborazione dell'interfaccia utente dei browser.Lo sviluppo dell'interfaccia utente è un tipico modello basato su eventi a thread singolo, quindi JavaScript ha anche formato l'elaborazione asincrona come paradigma di programmazione principale. Ma nelle applicazioni complesse e su larga scala, i problemi e le complessità causati dalla programmazione asincrona stanno diventando sempre più evidenti.

L'avvento di Node.js ha introdotto in JavaScript un nuovo paradigma di programmazione asincrona: loop di eventi e funzioni di callback. Questo paradigma di programmazione è efficiente e conciso ed è adatto per scenari ad alta concorrenza e a uso intensivo di I/O. Tuttavia, questo paradigma di programmazione porta anche i propri problemi e complessità, soprattutto in applicazioni complesse e su larga scala, i programmatori devono affrontare l'annidamento di molte funzioni di callback e l'ordine delle chiamate asincrone, aumentando la complessità e la difficoltà del programma.

Per risolvere questi problemi e difficoltà, sono nati i fibj. fibjs è un framework di sviluppo di server applicativi progettato principalmente per lo sviluppo di back-end Web. Si basa sul motore JavaScript di Google v8 e sceglie una soluzione di concorrenza diversa dal callback tradizionale. fibjs utilizza la fibra per isolare la complessità aziendale causata dalle chiamate asincrone a livello di framework, riducendo notevolmente la difficoltà di sviluppo e riducendo i problemi di prestazioni causati dalla frequente elaborazione asincrona nello spazio utente. Allo stesso tempo, rispetto al tradizionale paradigma di programmazione asincrona, il suo paradigma di programmazione sincrona è più leggibile, semplice nella logica e facile da mantenere.

Nel seguente contenuto, introdurremo i vantaggi e le caratteristiche di fibjs e spiegheremo come utilizzare le sue soluzioni di programmazione sincrona e asincrona attraverso esempi.

profilo in fibra

fibjs è un framework server JavaScript ad alte prestazioni basato sul motore v8, principalmente per lo sviluppo di backend web. Avviato nel 2009, ha già un'elevata stabilità e produttività e ha una vasta gamma di casi applicativi in ​​patria e all'estero.

In fibjs, la fibra viene utilizzata per risolvere il problema tra logica aziendale ed elaborazione I/O. La fibra è diversa dai concetti tradizionali come thread, coroutine e processi: è un thread leggero a livello di utente che può essere considerato un meccanismo multitasking cooperativo. La fibra può eseguire la logica aziendale e le operazioni di I/O in diversi contesti e gestire internamente le risorse attraverso la pre-allocazione e il riciclo.Rispetto ai thread e ai processi tradizionali, è più leggera, più flessibile e più efficiente .

Rispetto ad altre librerie di thread (come pthread, WinThread, Boost.Thread, ecc.), la fibra presenta i seguenti vantaggi:

  • Programmazione cooperativa : la fibra è una programmazione cooperativa che non richiede la programmazione preventiva da parte del kernel o del sistema operativo, il che riduce il frequente cambio di contesto, accelera l'esecuzione del programma ed evita race condition e deadlock tra i thread.

  • Leggero : ogni fibra deve consumare solo un piccolo spazio di stack e un gran numero di fibre può essere creato in applicazioni multi-concorrenti senza causare un utilizzo eccessivo della memoria.

  • Efficienza : la fibra è implementata in base alle funzionalità del linguaggio JavaScript stesso e sfrutta appieno le prestazioni superiori del motore v8, che è più veloce delle tradizionali librerie di thread.

Utilizzando la fibra, fibjs può separare la logica aziendale dall'elaborazione I/O, incapsulando così le chiamate asincrone in chiamate sincrone, rendendo la scrittura e la manutenzione del codice più facili e più facili da leggere, dando pieno gioco ai vantaggi del linguaggio JavaScript.

Programmazione sincrona in fibjs

Nella programmazione asincrona, a causa dell'annidamento delle funzioni di callback, la leggibilità del codice potrebbe essere scarsa ed è probabile che si verifichi il problema dell'inferno di callback, che aumenta la difficoltà del codice e il costo del debug. Il paradigma di programmazione sincrona è più in linea con la modalità di pensiero umano, rendendo la struttura del codice più chiara, più facile da leggere e più facile da mantenere, il che può migliorare notevolmente l'efficienza dello sviluppo e la qualità del codice.

In fibjs, la programmazione sincrona è un paradigma di programmazione molto popolare e comunemente usato, che rende la struttura e la logica del codice più intuitive, facili da capire e mantenere. Alcune funzioni e moduli di programmazione sincrona sono altamente supportati in fibjs, come util.sync, fs.readSync, ecc.

In fibjs, le funzioni asincrone degli oggetti integrati possono essere chiamate direttamente e in modo sincrono:

1 2 3 4
const fs = require("fs"); const data = fs.readFile("/path/to/file"); console.log(data);

Puoi anche eseguire il wrapping della funzione asincrona tramite util.sync e try...catch, in modo che la fibra possa ottenere il valore di ritorno della chiamata asincrona, in modo da ottenere un effetto sincrono, ad esempio:

1 2 3 4 5 6 7 8 9 10 11 12 13
// load module const coroutine = require("coroutine"); const util = require("util"); const fs = require("fs"); // use util.sync to wrap fs.readFile function readFile(path) { return util.sync(fs.readFile)(path); } // call the sync function const data = readFile("myfile.txt"); console.log(data);

Nell'esempio precedente, definiamo una funzione chiamata readFile e utilizziamo util.sync per incapsulare la funzione asincrona fs.readFile in una funzione sincrona, che può restituire direttamente i dati tramite una chiamata sincrona. Questo metodo di chiamata sincrona è simile al tradizionale paradigma di programmazione JavaScript, con la differenza che in fibjs i thread non vengono bloccati, ma gli effetti asincroni vengono raggiunti tramite le fibre.

Il principio di util.sync

util.sync è un'efficiente funzione wrapper del kernel, il seguente codice JavaScript può ottenere funzioni simili:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
const coroutine = require("coroutine"); function sync(func) { return function _warp() { var ev = new coroutine.Event(); var e, r; func.apply(this, [ ...arguments, function (err, result) { e = err; r = result; ev.set(); } ]); ev.wait(); if (e) throw e; return r; } }

Questo codice definisce una funzione di utilità sync per convertire una funzione di callback asincrona in una funzione di chiamata sincrona. Prende una funzione func e restituisce una nuova funzione _wrap. Questa nuova funzione implementa la funzione di conversione della funzione originale in una chiamata sincrona. Nella funzione _wrap, viene prima creato un nuovo oggetto Event ev per la pianificazione dei thread e l'attesa dei risultati di callback asincroni. Utilizzare quindi il metodo apply per chiamare la funzione originale func con i parametri specificati e una nuova funzione di callback come parametri. Durante la chiamata, si verifica un callback asincrono e la nuova funzione di callback memorizza i risultati restituiti nelle variabili e ed r e riattiva l'oggetto Event. Infine, in base alla variabile e decidere se lanciare un'eccezione o restituire la variabile r. Questa funzione implementa una soluzione per convertire una funzione di callback asincrona in una chiamata sincrona, che può migliorare la leggibilità e la manutenibilità della funzione.

Programmazione asincrona in fibjs

In fibjs, la maggior parte dei metodi asincroni (inclusi I/O e metodi di richiesta di rete, ecc.) possono supportare chiamate sincrone e asincrone allo stesso tempo, il che consente agli sviluppatori di scegliere quale metodo utilizzare in qualsiasi momento in base alle proprie esigenze di programmazione.

Prendendo fs.readFile() come esempio, possiamo utilizzare questo metodo in due modi:

Modo asincrono: passa una funzione di callback per elaborare il risultato della lettura del file, ad esempio:

1 2 3 4 5 6
const fs = require("fs"); fs.readFile("/path/to/file", (err, data) => { if (err) throw err; console.log(data); });

Questo approccio è adatto a situazioni in cui è necessario eseguire alcune operazioni dopo che la lettura del file è completa.

Modo sincrono: ottieni il contenuto del file non passando una funzione di callback, ad esempio:

1 2 3 4
const fs = require("fs"); const data = fs.readFile("/path/to/file"); console.log(data);

In questo esempio, otteniamo il contenuto del file leggendo i dati del valore di ritorno del file e non è necessario attendere l'esecuzione della funzione di callback del completamento della lettura del file prima di procedere. Questo approccio è adatto a situazioni in cui è necessario eseguire alcune operazioni prima che la lettura del file sia completa.

Si può vedere che questa caratteristica di supportare chiamate sincrone e asincrone consente agli sviluppatori di scegliere metodi diversi in base alle loro esigenze e scenari di sviluppo. In alcuni casi, il codice sincrono è più leggibile, più facile da mantenere ed eseguire il debug, mentre in alcuni casi il codice asincrono può migliorare meglio la reattività e le prestazioni del codice.

Tuttavia, è necessario prestare attenzione anche quando si utilizza il metodo sincrono: in alcuni scenari, questo metodo potrebbe bloccare la fibra corrente. Pertanto, dobbiamo scegliere il metodo di programmazione appropriato in base alle effettive esigenze.

Insomma

In questo articolo, abbiamo presentato lo stile di programmazione sincrono di fibjs e le soluzioni di programmazione asincrona, i loro vantaggi e gli scenari applicativi. Abbiamo accennato al fatto che fibjs può ridurre la complessità operativa e migliorare l'efficienza dello sviluppo del codice utilizzando la fibra per isolare la logica aziendale e i problemi di prestazioni causati dall'elaborazione asincrona. Allo stesso tempo, abbiamo anche sottolineato i vantaggi di fibjs nell'elaborazione I/O e nella gestione della memoria, che apportano grande praticità allo sviluppo, al test e alla manutenzione.

Infine, incoraggiamo i lettori a esplorare in profondità fibjs e a partecipare ai contributi fibjs e alle attività della comunità. Riteniamo che fibjs continuerà ad attirare l'attenzione e il supporto della comunità open source con le sue potenti prestazioni e facilità d'uso.

👉 【Aggiornamento a caldo del modulo server