Guía de desenvolvemento da guía

Sincrónico e asíncrono

introdución

A medida que as aplicacións web seguen a desenvolverse, JavaScript, como linguaxe de programación moi utilizada, tamén está en constante desenvolvemento e evolución. No desenvolvemento front-end web, JavaScript utilízase principalmente para o procesamento da interface de usuario do navegador. O desenvolvemento da interface de usuario é un modelo típico orientado a eventos dun só fío, polo que JavaScript tamén formou un paradigma de programación co procesamento asíncrono como paradigma de programación principal. Non obstante, en aplicacións complexas e a gran escala, os problemas e a complexidade causados ​​pola programación asíncrona son cada vez máis evidentes.

A aparición de Node.js trae un novo paradigma de programación asíncrona a JavaScript: bucles de eventos e funcións de devolución de chamada. Este paradigma de programación é eficiente e conciso, e é axeitado para escenarios de alta concorrencia e E/S intensivas. Non obstante, este paradigma de programación tamén trae os seus propios problemas e complexidades.Especialmente en aplicacións complexas e a gran escala, os programadores teñen que xestionar o problema de aniñar moitas funcións de devolución de chamada e deben tratar o problema da orde de chamada asíncrona, o que aumenta a complexidade. e dificultade do programa.

Para resolver estes problemas e dificultades, xurdiron fibjs. fibjs é un marco de desenvolvemento de servidores de aplicacións deseñado principalmente para o desenvolvemento de back-end web. Está baseado no motor JavaScript de Google v8 e elixe unha solución de simultaneidade diferente á tradicional. fibjs usa fibra para illar a complexidade empresarial causada polas chamadas asíncronas na capa de marco, reducindo moito a dificultade de desenvolvemento e reducindo os problemas de rendemento causados ​​polo procesamento asíncrono frecuente no espazo do usuario. Ao mesmo tempo, en comparación co paradigma de programación asíncrona tradicional, o seu paradigma de programación síncrona ten as vantaxes dunha maior lexibilidade, unha lóxica sinxela e un mantemento sinxelo.

No seguinte contido, presentaremos as vantaxes e características de fibjs, e explicaremos como utilizar as súas solucións de programación síncrona e asíncrona a través de exemplos.

introdución da fibra

fibjs é un cadro de servidor JavaScript de alto rendemento baseado no motor v8, principalmente para o desenvolvemento de back-end web. Iniciado en 2009, xa ten unha gran estabilidade e produtividade, e conta cunha ampla gama de casos de aplicación no país e no estranxeiro.

En fibjs, a fibra úsase para resolver o problema entre a lóxica empresarial e o procesamento de E/S. A fibra é diferente dos conceptos tradicionais como fíos, corrutinas e procesos. É un fío lixeiro a nivel de usuario que se pode considerar como un mecanismo cooperativo de tarefas múltiples. A fibra pode realizar operacións de lóxica de negocio e de E/S en diferentes contextos, e xestiona os recursos internamente mediante a asignación previa e a reciclaxe. En comparación cos procesos e fíos tradicionais, é máis lixeiro, máis flexible e máis eficiente. .

En comparación con outras bibliotecas de fíos (como pthread, WinThread, Boost.Thread, etc.), a fibra ten as seguintes vantaxes:

  • Programación colaborativa : a fibra é unha programación colaborativa que non require unha programación preventiva por parte do núcleo ou do sistema operativo. Reduce o cambio de contexto frecuente, acelera a velocidade de execución do programa e evita as condicións de competencia e os problemas de bloqueo entre fíos.

  • Lixeiro : cada fibra só consome un pequeno espazo de pila e pódese crear un gran número de fibras en aplicacións multi-concurrentes sen causar o problema de ocupar demasiada memoria.

  • Eficiencia : a fibra implícase en función das características da propia linguaxe JavaScript e fai un uso completo do rendemento superior do motor v8, que é máis rápido que as bibliotecas de fíos tradicionais.

Ao usar fibra, os fibjs poden separar a lóxica de negocio e o procesamento de E/S, encapsulando as chamadas asíncronas en forma de chamadas síncronas, facendo que a escritura e o mantemento do código sexan máis sinxelos e de lectura, e ao mesmo tempo dándolle todo o partido ás vantaxes do Linguaxe JavaScript.

Programación sincrónica en fibjs

Na programación asíncrona, a aniñación de funcións de devolución de chamada pode levar a unha mala lexibilidade do código, causar facilmente o problema do inferno de devolución de chamada e aumentar a dificultade do código e o custo da depuración. O paradigma de programación sincrónica está máis en liña cos patróns de pensamento humano, facendo que a estrutura do código sexa máis clara, máis fácil de ler e de manter, o que pode mellorar moito a eficiencia do desenvolvemento e a calidade do código.

En fibjs, a programación síncrona é un paradigma de programación moi popular e de uso común, o que fai que a estrutura e a lóxica do código sexan máis intuitivas, fáciles de entender e manter. Algunhas funcións e módulos de programación síncrona son moi compatibles con fibjs, como util.sync, fs.readSync, etc.

En fibjs, pode chamar directamente as funcións asíncronas dos obxectos incorporados de forma síncrona:

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

Tamén pode envolver a función asíncrona a través de util.sync e probar...catch, para que a fibra poida obter o valor de retorno da chamada asíncrona, logrando así o efecto de sincronización, por exemplo:

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

No exemplo anterior, definimos unha función chamada readFile e utilizamos util.sync para encapsular a función asincrónica fs.readFile nunha función síncrona. Esta función pode devolver datos directamente mediante chamadas síncronas. Este método de chamada síncrona é semellante ao paradigma de programación JavaScript tradicional.A diferenza é que en fibjs, o fío non se bloquea, pero o efecto asíncrono conséguese a través da fibra.

Como funciona util.sync

util.sync é unha función de envoltura eficiente do núcleo. O seguinte código JavaScript pode realizar funcións similares:

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

Este código define unha función de sincronización da ferramenta para converter unha función de devolución de chamada asíncrona nunha función de chamada síncrona. Recibe unha función func e devolve unha nova función _wrap. Esta nova función implementa a función de converter a función orixinal nunha chamada síncrona. Na función _wrap, primeiro créase un novo obxecto Event ev para a programación de fíos e agardando resultados de devolución de chamada asíncronos. A continuación, use o método apply para chamar á función orixinal cos parámetros especificados e unha nova función de devolución de chamada como parámetros. Durante o proceso de chamada, prodúcese unha devolución de chamada asíncrona e a nova función de devolución de chamada almacena os resultados devoltos nas variables e e r e activa o obxecto Event. Finalmente, decídese segundo a variable e se se debe lanzar unha excepción ou devolver a variable r. Esta función implementa unha solución para converter as funcións de devolución de chamada asíncronas en chamadas síncronas, o que pode mellorar a lexibilidade e o mantemento da función.

Programación asíncrona en fibjs

En fibjs, a maioría dos métodos asíncronos (incluíndo E/S e métodos de solicitude de rede, etc.) poden admitir chamadas síncronas e asíncronas, o que permite aos desenvolvedores escoller que método usar segundo as súas necesidades de programación en calquera momento.

Tomando fs.readFile() como exemplo, podemos usar este método de dúas formas:

Método asíncrono: procesa o resultado da lectura do ficheiro pasando unha función de devolución de chamada, por exemplo:

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

Este método é axeitado para situacións nas que precisa realizar algunhas operacións despois de ler o ficheiro.

Método sincrónico: obtén o contido do ficheiro sen pasar unha función de devolución de chamada, por exemplo:

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

Neste exemplo, obtemos o contido do ficheiro lendo os datos do valor de retorno do ficheiro. Non hai que esperar a que a función de devolución de chamada complete a lectura do ficheiro antes de continuar coa operación. Este método é axeitado para situacións nas que precisa realizar algunhas operacións antes de completar a lectura do ficheiro.

Pódese ver que esta característica de admitir chamadas tanto síncronas como asíncronas permite aos desenvolvedores escoller utilizar diferentes métodos segundo as súas propias necesidades e escenarios de desenvolvemento. Nalgúns casos, o código síncrono é máis lexible e máis fácil de manter e depurar, mentres que nalgúns casos, o código asíncrono pode mellorar mellor a velocidade de resposta e o rendemento do código.

Non obstante, debes ter coidado ao usar o método de sincronización. Nalgúns casos, este método pode bloquear a fibra actual. Polo tanto, temos que escoller o método de programación axeitado en función das necesidades reais.

En conclusión

Neste artigo, presentamos o estilo de programación síncrona e as solucións de programación asíncrona de fibjs, así como as súas vantaxes e escenarios de aplicación. Mencionamos que as fibjs poden reducir a complexidade operativa e mellorar a eficiencia do desenvolvemento de código mediante o uso de fibra para illar a lóxica empresarial e os problemas de rendemento causados ​​polo procesamento asíncrono. Ao mesmo tempo, tamén destacamos as vantaxes dos fibjs no procesamento de E/S e na xestión da memoria, o que aporta unha gran comodidade ao desenvolvemento, probas e mantemento.

Finalmente, animamos aos lectores a explorar fibjs en profundidade e participar nas contribucións e actividades comunitarias de fibjs. Cremos que fibjs seguirá atraendo a atención e o apoio da comunidade de código aberto co seu poderoso rendemento e facilidade de uso.

👉【Actualización quente do módulo do servidor