Async de uma maneira bloqueada na linguagem do programa?
Maneira de sincronização
Por exemplo, ruby:
con = Mysql.new('localhost')
rs1 = con.query('select * from test01') # A
rs2 = con.query('select * from test02') # B
rs = getResult(rs1, rs2) # C
con.close
tãoA
irá bloquear a execução.B
será executado atéA
é feito. O mesmo aconteceC
por exemplo, nodejs
var mysql = require('mysql');
var connection = mysql.createConnection({host : 'localhost',});
connection.connect();
connection.query('SELECT * from test01', function(err, rows, fields) {
console.log(rows);
}); // A
connection.query('SELECT * from test02', function(err, rows, fields) {
console.log(rows);
}); // B
connection.end();
A
não vai bloquearB
, mas normalmente o código deve ficar assim:
connection.query('SELECT * from test01', function(err, rows1, fields) { // A
connection.query('SELECT * from test02', function(err, rows2, fields) { // B
getResult(rows1, rows2); // C
});
});
Ou usando a promessa de executar paralelamente
Promise.all([
connection.query('SELECT * from test01'),
connection.query('SELECT * from test02'),])
.then(function(data) {
getResult(data[0], data[1])
})
A minha pergunta é: tem que ser assim? É possível escrever código de sincronização, mas obter um efeito assíncrono?
Por exemplo, languageX:
VAR con = Mysql=>new('localhost') # A
VAR rs1 = con=>query('select * from test01') # B
VAR rs2 = con=>query('select * from test02') # C
VAR rs = getResult(rs1, rs2) # D
con=>close # E
processo é:
A, basta executá-lo e encaminhar para BB, execute-o e encaminhe-o para C e marque em algum lugar internamente, pois isso é bloqueio de IOC, execute-o e encaminhe-o para D e marque em algum lugar internamente, pois isso é bloqueio de IOD, execute apenas quando rs1 e rs2 estiverem prontos, mas não bloqueie aqui, também não execute E (pode lidar com outras solicitações, etc)quando rs1 e rs2 estiverem prontos, execute e encaminhe para EO que estou tentando dizer aqui é que, sem a bagunça do retorno de chamada, mas com um código limpo e simples, podemos obter E / S sem bloqueio.