以阻塞程序语言的方式进行异步?

2024-03-25

  1. Sync way

例如,红宝石:

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  

so A会阻塞执行。B将被执行直到A已经完成了。也是如此C

  1. 异步方式

例如,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不会阻塞B,但通常代码应该如下所示:

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

或者使用promise并行执行

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

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

例如,语言X:

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。


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

是的。您可以在 Node 7+ 上使用 async/await,或者在旧版本的 Node 上使用基于生成器的协程。

它看起来像:

var x = await f1();
var y = await f2(x);
// ...

or even:

var y = await f2(await f1());
// ...

但它仍然是异步和非阻塞的。 您可以将该语法与任何返回 Promise 的函数一起使用 - 就像 Node 中的许多数据库驱动程序和 ORM/ODM 所做的那样。

请参阅这些答案以获取更多示例:

  • 如何使用 Express 从一个端点发送多个查询? https://stackoverflow.com/questions/43326470/how-do-i-send-multiple-queries-from-one-endpoint-with-express/43326592#43326592
  • 我无法在 Node.js 中获取“结果”的值 https://stackoverflow.com/questions/43747592/i-cant-get-the-value-of-result-in-node-js/43747648#43747648
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以阻塞程序语言的方式进行异步? 的相关文章

随机推荐

  • 在 VS 2012 中部署 Visual Studio 插件

    我已经成功创建了 Visual Studio 插件 但是我很困惑如何在另一台计算机上部署这个插件 我已经浏览了 stackoverflow 的答案 但是我对此事没有明确的想法 您只需将 YourAddIn dll 和 YourAddIn A
  • 将函数指针设置为静态地址

    我正在将 DLL 注入另一个进程 并希望根据其地址 0x54315 调用该二进制文件中的函数 我怎样才能真正声明一个函数 然后将其设置到这个地址 define FUNC 0x54315 void myFuncPtr int main myF
  • UI 自动化 - 为另一个应用程序的文本框设置文本

    我有两种形式 当单击其中一个按钮时 我想打开另一个按钮并在其中填充一个文本框 我尝试使用下面的代码 但它给出了一个错误 指出 不支持的模式 这是我的代码 private void button1 Click object sender Ev
  • 找出长度为 N 的两个字符的所有可能组合

    我有两个角色 例如 a a b b 我需要找到这两个字符的所有可能组合 从而形成长度为 N 的字符串 例如 如果N 3 combinations aab aba baa abb bab bba aaa bbb 某些模块中有此功能吗 iter
  • 覆盖 Django 模型 __init__ 方法

    我的 Django 项目的 Ingredient 模型有一个IntegerField它声明该原料库存是否按重量 单位或窝数进行管理 虽然数据库有它的integervalue 我必须显示它的名称 我认为最好覆盖每个成分并设置其值 而不是覆盖
  • 清理我的 git 分支的开发功能

    我参加 git 聚会有点晚了 我有一个简单的问题 我的主分支上目前正在开发三个功能实验 这些功能可以称为postits auth and uploads 当我做git status在我的主分支上 我得到了 已更改但未更新 中约 10 个条目
  • iOS 14/Xcode 12.0.1 更新后 UIPickerView 渲染不正确

    有人注意到应用程序 UIPickerViews 中的文本渲染不正确 第一个字符被截断吗 我在多个设备上的应用程序的所有 UIPickerViews 中看到了这一点 在大多数情况下 您可以看到第一个字符的几个像素 我尝试过从手机中删除派生数据
  • 许多基于backbone.js 的框架在现实世界中的优点和缺点是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 希望有人可以分享他们对一些最新出现的backbone js 变体的经验 我在几个项目中对主干 下划线 需求有一些很好的经验 我希望下一步朝着复杂
  • 寻找在巨大的 Pandas Dataframe 中对行进行切片的最快方法

    我的程序需要根据一个巨大的 Pandas Dataframe 中的列值获取一行 响应时间至关重要 我使用最常见的方法来做到这一点 例如 df loc df id 500000 Per timeit在我的 Mac 上 对 100 万行的数据帧
  • 我的 @media 查询无法在移动设备上运行

    如果浏览器宽度小于五个图像 包括边距等 我试图允许每行保存五个图像的容器更改其宽度的大小 我添加了以下媒体查询 在台式计算机上浏览时一切正常 将浏览器大小调整为宽度小于 1080 像素 容器更改宽度且内容居中 但是 在移动设备 iPhone
  • extract>> 运算符在 C++ 中到底如何工作

    我是一名计算机科学专业的学生 因此对 C 语言 考虑到这是我使用这种语言的第一个学期 或编码方面没有太多经验 我被分配从文本文件中读取整数 其简单形式如下 19 3 2 9 14 4 5 9 10 3 这让我踏上了更好地理解 I O 操作符
  • 声明式 SQLAlchemy 中的标签字典?

    我正在开发一个相当大的代码库 该代码库已使用sqlalchemy ext declarative 我需要向其中一个类添加一个类似字典的属性 我需要的是一样的这个问题 https stackoverflow com questions 780
  • 在函数中使用设置间隔和获取

    创建一个函数startShowingMessage它有两个参数 一个元素和一个 URL 字符串 该函数将使用setInterval每 1 秒执行以下任务 获取 URL 并将响应文本放入所提供元素的文本内容中 我制作了该函数并且获取有效 但我
  • HTML5 使用什么视频格式以及为什么它与 iPad 上的 Safari 兼容

    HTML5支持哪些视频格式与iPhone iPad兼容 我正在考虑建立一个带有一些教学视频的网站 但现在我很困惑 因为我认为 Apple 移动设备仅支持 Quicktime 它使用 H 264 尽管 HTML5 规范并未将其描述为必须使用
  • 使用 SQLalchemy 读取大文件

    我正在尝试使用 SQLalchemy 读取 200 MB 的 csv 文件 每行大约有 30 列 其中 我使用下面的代码仅使用 8 列 然而 代码运行速度非常慢 有没有办法改善这一点 我想使用地图 列表理解或其他技术 正如你所说 我是一个新
  • 使用 Linq 从 xml 文件读取值

    我在从 xml 文件读取值时遇到问题 这是 xml 文件
  • 如何在此数据上使用 PIVOT:?

    我有一个 SQL Server 表 如下所示 RESOURCE DESCRIPTION VALUE Test A Name Resource A xyz Test A Height 20 Test A Unit ft Test A Loca
  • IntelliJ 15 运行缓慢并占用 1GB 内存

    我刚刚安装了intelliJ IDEA 15但它有点滞后并且使用大量内存 有时 我的 4GB RAM 笔记本电脑上的内存会超过 1GB 以前的版本是intelliJ性能更好 我怎样才能让它更快 我遇到的另一个问题是自动完成和更正 这两个设置
  • RQ - 清空和删除队列

    我在用着RQ http python rq org 我有一个failed排队有数千件物品 还有另一个test我不久前创建的用于测试的队列现在是空的且未使用 我想知道如何删除所有作业failed排队 然后删除test完全排队吗 对于基本问题表
  • 以阻塞程序语言的方式进行异步?

    Sync way 例如 红宝石 con Mysql new localhost rs1 con query select from test01 A rs2 con query select from test02 B rs getResu