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
4const 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
23const 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
6const 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
4const 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.