首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用阻塞程序语言进行异步操作吗?

用阻塞程序语言进行异步操作吗?
EN

Stack Overflow用户
提问于 2017-05-15 07:39:34
回答 1查看 153关注 0票数 0
  1. 同步方式

例如,红宝石:

代码语言:javascript
复制
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  

因此,A将阻止执行。B将被执行,直到A完成为止。C也是

  1. 异步方式

例如,nodejs

代码语言:javascript
复制
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不会阻止B,但是通常代码应该如下所示:

代码语言:javascript
复制
connection.query('SELECT * from test01', function(err, rows1, fields) {   // A
  connection.query('SELECT * from test02', function(err, rows2, fields) { // B
    getResult(rows1, rows2); // C
  });
});

或者用承诺来并行执行

代码语言:javascript
复制
Promise.all([
connection.query('SELECT * from test01'),
connection.query('SELECT * from test02'),])
.then(function(data) {
  getResult(data[0], data[1])
 })

我的问题是,一定要这样吗?是否可以通过编写同步代码而获得异步效果?

例如,languageX:

代码语言:javascript
复制
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

程序是:

  1. A,执行它,然后转发给B
  2. B,执行它并转发给C,并在内部的某个地方标记,因为这是IO阻塞。
  3. C,执行它并转发到D,并在内部的某个地方标记,因为这是IO阻塞。
  4. D,只在rs1和rs2准备就绪时执行它,而不是在这里阻塞,也不执行E(可以处理其他请求,等等)
  5. 当rs1和rs2准备就绪时,执行并转发到E

我在这里想说的是,没有乱七八糟的回调,而是干净的、简单的、简单的代码,我们可以获得非阻塞IO。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-15 09:46:52

我的问题是,一定要这样吗?是否可以通过编写同步代码而获得异步效果?

是。您可以在节点7+上使用异步/等待,也可以在较早版本的节点上使用基于生成器的协同。

它看起来会像:

代码语言:javascript
复制
var x = await f1();
var y = await f2(x);
// ...

甚至:

代码语言:javascript
复制
var y = await f2(await f1());
// ...

但它仍将是异步和非阻塞的。您可以在任何返回承诺的函数中使用这种语法--就像Node中的许多数据库驱动程序和ORMs/ODM一样。

关于更多的例子,请参见这些答案:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43973850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档