Guia de desenvolupament de la guia

Sincrònic i asíncron

introducció

A mesura que les aplicacions web continuen desenvolupant-se, JavaScript, com a llenguatge de programació àmpliament utilitzat, també està en constant desenvolupament i evolució. En el desenvolupament de front-end web, JavaScript s'utilitza principalment per al processament de la interfície d'usuari del navegador. El desenvolupament de la interfície d'usuari és un model típic d'un sol fil basat en esdeveniments, de manera que JavaScript també ha format un paradigma de programació amb el processament asíncron com a paradigma de programació principal. Tanmateix, en aplicacions complexes i a gran escala, els problemes i la complexitat causats per la programació asíncrona són cada cop més evidents.

L'aparició de Node.js aporta un nou paradigma de programació asíncrona a JavaScript: bucles d'esdeveniments i funcions de devolució de trucada. Aquest paradigma de programació és eficient i concís, i és adequat per a escenaris d'alta concurrència i intensius d'E/S. No obstant això, aquest paradigma de programació també comporta els seus propis problemes i complexitats.Especialment en aplicacions complexes i a gran escala, els programadors han de fer front al problema de l'imbricació de moltes funcions de devolució de trucada i han de fer front al problema de l'ordre de trucada asíncron, que augmenta la complexitat. i dificultat del programa.

Per resoldre aquests problemes i dificultats, van sorgir els fibjs. fibjs és un marc de desenvolupament de servidors d'aplicacions dissenyat principalment per al desenvolupament de back-end web. Es basa en el motor JavaScript de Google v8 i tria una solució de concurrència diferent de la devolució de trucada tradicional. fibjs utilitza fibra per aïllar la complexitat empresarial causada per trucades asíncrones a la capa de marc, reduint en gran mesura la dificultat de desenvolupament i reduint els problemes de rendiment causats pel processament asíncron freqüent a l'espai d'usuari. Al mateix temps, en comparació amb el paradigma de programació asíncrona tradicional, el seu paradigma de programació síncrona té els avantatges d'una major llegibilitat, una lògica senzilla i un manteniment fàcil.

En el següent contingut, presentarem els avantatges i les característiques de fibjs, i explicarem com utilitzar les seves solucions de programació síncrona i asíncrona mitjançant exemples.

introducció de fibra

fibjs és un marc de servidor JavaScript d'alt rendiment basat en el motor v8, principalment per al desenvolupament de back-end web. Iniciat l'any 2009, ja té una gran estabilitat i productivitat, i disposa d'una àmplia gamma de casos d'aplicació a casa i a l'estranger.

En fibjs, la fibra s'utilitza per resoldre el problema entre la lògica empresarial i el processament d'E/S. La fibra és diferent dels conceptes tradicionals com ara fils, corrutines i processos. És un fil lleuger a nivell d'usuari que es pot considerar com un mecanisme cooperatiu de múltiples tasques. La fibra pot realitzar operacions de lògica empresarial i d'E/S en diferents contextos, i gestiona els recursos internament mitjançant la preassignació i el reciclatge. En comparació amb els fils i processos tradicionals, és més lleugera, més flexible i més eficient. .

En comparació amb altres biblioteques de fils (com ara pthread, WinThread, Boost.Thread, etc.), la fibra té els avantatges següents:

  • Programació col·laborativa : Fiber és una programació col·laborativa que no requereix programació preventiva per part del nucli o del sistema operatiu. Redueix els canvis de context freqüents, accelera la velocitat d'execució del programa i evita les condicions de competència i els problemes de bloqueig entre fils.

  • Pes lleuger : cada fibra només consumeix un petit espai de pila, i es pot crear un gran nombre de fibres en aplicacions multi-concurrents sense causar el problema d'ocupar massa memòria.

  • Eficàcia : la fibra s'implementa en funció de les característiques del propi llenguatge JavaScript i aprofita al màxim el rendiment superior del motor v8, que és més ràpid que les biblioteques de fils tradicionals.

Mitjançant l'ús de fibra, els fibjs poden separar la lògica empresarial i el processament d'E/S, encapsulant així les trucades asíncrones en forma de trucades síncrones, fent que l'escriptura i el manteniment del codi siguin més senzills i fàcils de llegir i, al mateix temps, donen un joc total als avantatges del Llenguatge JavaScript.

Programació síncrona en fibjs

En la programació asíncrona, la nidificació de funcions de devolució de trucada pot provocar una mala llegibilitat del codi, provocar fàcilment el problema de l'infern de la devolució de trucada i augmentar la dificultat del codi i el cost de la depuració. El paradigma de programació síncrona està més en línia amb els patrons de pensament humà, fent que l'estructura del codi sigui més clara, més fàcil de llegir i de mantenir, cosa que pot millorar molt l'eficiència del desenvolupament i la qualitat del codi.

En fibjs, la programació síncrona és un paradigma de programació molt popular i d'ús habitual, que fa que l'estructura i la lògica del codi siguin més intuïtives, fàcils d'entendre i mantenir. Algunes funcions i mòduls de programació síncrona són molt compatibles amb fibjs, com ara util.sync, fs.readSync, etc.

A fibjs, podeu trucar directament a funcions asíncrones dels objectes integrats de manera síncrona:

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

També podeu embolicar la funció asíncrona mitjançant util.sync i provar...catch, de manera que la fibra pugui obtenir el valor de retorn de la trucada asíncrona, aconseguint així l'efecte de sincronització, per exemple:

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);

A l'exemple anterior, hem definit una funció anomenada readFile i hem utilitzat util.sync per encapsular la funció asíncrona fs.readFile en una funció síncrona. Aquesta funció pot retornar dades directament mitjançant trucades síncrones. Aquest mètode de trucada síncrona és similar al paradigma de programació JavaScript tradicional.La diferència és que en fibjs, el fil no està bloquejat, però l'efecte asíncron s'aconsegueix a través de la fibra.

Com funciona util.sync

util.sync és una funció d'embolcall eficient del nucli. El codi JavaScript següent pot aconseguir funcions similars:

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; } }

Aquest codi defineix una funció de sincronització d'eina per convertir una funció de devolució de trucada asíncrona en una funció de trucada síncrona. Rep una funció func i retorna una nova funció _wrap. Aquesta nova funció implementa la funció de convertir la funció original en una trucada síncrona. A la funció _wrap, primer es crea un nou objecte d'esdeveniment ev per a la programació de fils i a l'espera de resultats de devolució de trucada asíncrona. A continuació, utilitzeu el mètode apply per cridar a la funció de funció original amb els paràmetres especificats i una nova funció de devolució de trucada com a paràmetres. Durant el procés de trucada, es produeix una devolució de trucada asíncrona i la nova funció de devolució de trucada emmagatzema els resultats retornats a les variables e i r i activa l'objecte Event. Finalment, es decideix segons la variable e si es llança una excepció o es retorna la variable r. Aquesta funció implementa una solució per convertir les funcions de devolució de trucada asíncrones en trucades síncrones, la qual cosa pot millorar la llegibilitat i el manteniment de la funció.

Programació asíncrona en fibjs

En fibjs, la majoria dels mètodes asíncrons (inclosos els mètodes d'E/S i de sol·licitud de xarxa, etc.) poden suportar tant trucades síncrones com asíncrones, cosa que permet als desenvolupadors triar quin mètode utilitzar segons les seves necessitats de programació en qualsevol moment.

Prenent fs.readFile() com a exemple, podem utilitzar aquest mètode de dues maneres:

Mètode asíncron: processa el resultat de la lectura del fitxer passant una funció de devolució de trucada, per exemple:

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

Aquest mètode és adequat per a situacions en què necessiteu realitzar algunes operacions després de llegir el fitxer.

Mètode sincrònic: obteniu el contingut del fitxer sense passar una funció de devolució de trucada, per exemple:

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

En aquest exemple, obtenim el contingut del fitxer llegint les dades del valor de retorn del fitxer. No cal esperar que la funció de devolució de trucada completi la lectura del fitxer abans de continuar l'operació. Aquest mètode és adequat per a situacions en què necessiteu realitzar algunes operacions abans de completar la lectura del fitxer.

Es pot veure que aquesta característica de suport de trucades síncrones i asíncrones permet als desenvolupadors triar utilitzar diferents mètodes segons les seves pròpies necessitats i escenaris de desenvolupament. En alguns casos, el codi síncron és més llegible i més fàcil de mantenir i depurar; mentre que en alguns casos, el codi asíncron pot millorar millor la velocitat de resposta i el rendiment del codi.

Tanmateix, heu de tenir cura quan feu servir el mètode de sincronització. En alguns escenaris, aquest mètode pot bloquejar la fibra actual. Per tant, hem de triar el mètode de programació adequat en funció de les necessitats reals.

en conclusió

En aquest article, presentem l'estil de programació síncrona i les solucions de programació asíncrona de fibjs, així com els seus avantatges i escenaris d'aplicació. Hem esmentat que els fibjs poden reduir la complexitat operativa i millorar l'eficiència del desenvolupament del codi mitjançant l'ús de fibra per aïllar els problemes de lògica empresarial i de rendiment causats pel processament asíncron. Al mateix temps, també hem posat èmfasi en els avantatges dels fibjs en el processament d'E/S i la gestió de la memòria, la qual cosa aporta una gran comoditat al desenvolupament, proves i manteniment.

Finalment, animem els lectors a explorar els fibjs en profunditat i a participar en les contribucions i activitats de la comunitat de fibjs. Creiem que fibjs continuarà cridant l'atenció i el suport de la comunitat de codi obert amb el seu potent rendiment i facilitat d'ús.

👉【Actualització calenta del mòdul del servidor