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

Maneira assíncrona

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 E

O 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.

questionAnswers(1)

yourAnswerToTheQuestion