¿Asíncrono en un lenguaje de programa de bloqueo?

Forma de sincronización

Por ejemplo, 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  

entoncesA bloqueará la ejecución.B se ejecutará hastaA está hecho. También lo haceC

Manera asincrónica

por ejemplo, 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 no bloquearáB, pero normalmente el código debería verse así:

connection.query('SELECT * from test01', function(err, rows1, fields) {   // A
  connection.query('SELECT * from test02', function(err, rows2, fields) { // B
    getResult(rows1, rows2); // C
  });
});

O usando la promesa de ejecutar en paralelo

Promise.all([
connection.query('SELECT * from test01'),
connection.query('SELECT * from test02'),])
.then(function(data) {
  getResult(data[0], data[1])
 })

Mi pregunta es, ¿tiene que ser así? ¿Es posible escribiendo código de sincronización pero obteniendo un efecto asíncrono?

Por ejemplo, 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

el proceso es:

A, simplemente ejecútalo y reenvía a BB, ejecútelo y reenvíelo a C, y marque en algún lugar internamente ya que esto es un bloqueo de E / SC, ejecútelo y reenvíelo a D, y marque en algún lugar internamente ya que esto es un bloqueo de E / SD, ejecútelo solo cuando rs1 y rs2 estén listos, pero no bloquee aquí, tampoco ejecute E (puede manejar otras solicitudes, etc.)cuando rs1 y rs2 están listos, ejecutar y reenviar a E

Lo que estoy tratando de decir aquí es que, sin el desorden de la devolución de llamada, pero limpio, simplemente, código simple podemos obtener IO sin bloqueo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta