QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

core.async: 另一种 Clojure 和 ClojureScript 异步编程方式

  • 2013-07-28
  • 本文字数:1350 字

    阅读完需:约 4 分钟

虽然 core.async Clojure/ClojureScript 库发布还不到一个月,但是与此相关的博客帖子已经发布了很多,它们描述了如何有效地使用 core.async 在前端代码中避免“回调嵌套”,还展示了一些令人印象深刻的浏览器示例的简单代码

core.async 是一个用 Clojure 编写的,Clojure 和 ClojureScript 都能使用的库。Clojure 是一个基于 JVM 的 Lisp 实现。ClojureScript 是 Clojure 的一个子集,它可以将 Clojure 编译成 JavaScript。core.async 很好地呈现了 Lisp 所必须提供的宏机制的能力:很多其他的语言要实现 core.async 所做的事情必须要对语言做出改变,但是在一个 Lisp 中则可以通过使用的库来实现。

正如名字所提示的,core.async 是为了简化异步编程而设计的。它借鉴了 Go 语言的很多思想,特别是它的 goroutine (在 core.async 中称为 go blocks)和通道理念。一个通道是一个有一个或者多个发布者和一个或者多个消费者的队列。它的原理很简单:发布者将数据放到队列中,消费者从队列中获取数据。在 Clojure/ClojureScript 中数据是不可变的,通道提供了一种安全的方式在线程间通信。但是在 ClojureScript 中后者并不是一个特别有趣的特性,因为 JavaScript 是单线程的。

core.async 提供了两种方式向通道写入或者从通道读取数据:阻塞式和非阻塞式。一个阻塞写操作会阻塞线程,直到通道有空间被写入时为止(一个通道的缓冲区大小是可配置的);一个阻塞读操作会阻塞线程,直到队列中的值能够被读取到时为止。更有趣的是,ClojureScript 仅支持异步的通道读取和写入,并且这仅在“go 语句块”中才被允许。Go 语句块是按照同步风格编写的,在内部这些语句块会被转换成一个能够异步执行它们的状态机。

想想下面这段基于 core.async 的代码:

复制代码
(let [ch (chan)]
(go (while true
(let [v (<! ch)]
(println "Read: " v))))
(go (>! ch "hi")
(<! (timeout 5000))
(>! ch "there")))

在这个示例中,let 引入了一个新的局部变量 ch,它是一个新通道。在 let 域中定义了两个 go 语句块,第一个是一个永久循环,它从通道 ch 中读取(<!)一个新的值赋给变量 v。然后它会把“Read:”和读取到的值打印到标准输出。第二个 go 语句块向通道 ch:”hi”中写入(>!)两个值,然后它会等待 5 秒钟再向通道中写入“there”。等待 5 秒钟是通过一个 timeout 通道实现的,该通道会在设置的超时时间过后关闭自己(返回 nil)。在 Clojure REPL 中运行这段代码时,它会立即返回。然后它将打印“Read:hi”,5 秒钟之后它会打印“Read:there”。

无论哪个 JavaScript 程序员,在看到这个 while 循环的时候都会感到怪异:你不能这样实现阻塞循环:浏览器将会冻结 5 秒钟。core.async 的“魔力”在于,它会在内部将每一个 go 语句块的主体部分转换成一个状态机,并且将同步通道的读写转变成异步调用。如果你想获取 core.async 相关的更多信息,或者了解它对前端 Web 开发有什么影响,可以查看下面的资源:

查看英文原文 core.async: A Different Approach to Asynchronous Programming with Clojure and ClojureScript

2013-07-28 03:575997
用户头像

发布了 321 篇内容, 共 120.8 次阅读, 收获喜欢 19 次。

关注

评论

发布
暂无评论
发现更多内容

Veritas Enterprise Vault 15.1 (Windows) - 自动捕获数据并归档信息

sysin

vault Veritas Enterprise

MathType导数符号怎么打 MathType导数头上一点怎么打

阿拉灯神丁

数学 教程分享 MathType 导数 公式函数

如何挑选适合企业的项目进度工具?9款推荐

爱吃小舅的鱼

项目进度系统

XMind for mac (XMind思维导图)中文版

Mac相关知识分享

图解TreeMap数据结构设计与应用案例

肖哥弹架构

Java 容器 数据结构

Scroll 生态首个 meme 项目 $Baggor,我们可以有哪些期待?

西柚子

VMware Aria Operations for Logs 8.18 发布,新增功能概览

sysin

vmware Aira Operations

Windows Server 2022 中文版、英文版下载 (updated Oct 2024)

sysin

windows Server 2022

鸿蒙开发案例:电子木鱼

zhongcx

文献管理软件:EndNote 21(Win&Mac) 激活版

你的猪会飞吗

Photoshop 2025(PS2025)直装版

你的猪会飞吗

PS2025下载 PS2025破解版 Photoshop 2025下载

智能监控,精细分析:淘宝API赋能商家商品管理新境界

代码忍者

pinduoduo API API 性能测试

专业的矢量图形设计工具Sketch for mac

Mac相关知识分享

功能强大的虚拟机软件VMware Fusion Pro 13 for Mac

Mac相关知识分享

办公软件Microsoft 365 for Mac(原Office 365)

Mac相关知识分享

Pencils Protocol 用户福利,DAPP持有者将获 Scroll 生态空投

BlockChain先知

《使用Gin框架构建分布式应用》阅读笔记:p88-p100

codists

Go gin 编程人

图解HashMap数据结构设计与应用案例

肖哥弹架构

Java 容器 数据结构

Mac下的压缩包和Win看到的不一样怎么办 Mac压缩后Win电脑看文件名会乱码

阿拉灯神丁

#Mac 苹果电脑 解压缩工具 压缩软件 BetterZip 5

Sophos Firewall v21 发布,新增功能概览

sysin

防火墙 sophos

guitar pro可以制作简谱吗 guitar pro怎么编辑六线谱

阿拉灯神丁

五线谱 吉他学习 软件包 Guitar Pro8 Mac乐谱制作软件

Pencils Protocol 用户福利,DAPP持有者将获 Scroll 生态空投

股市老人

松柏傲霜时:保利发展加速转型,华为带来技术支柱

脑极体

AI

我对智能体产品整体设计思路

大东(AIP内容运营专员)

深度解析阿里巴巴1688商品详情API返回的JSON数据结构

代码忍者

pinduoduo API API 性能测试

专业视频编辑软件Final Cut Pro X for Mac(fcpx视频剪辑)

Mac相关知识分享

core.async: 另一种Clojure和ClojureScript异步编程方式_语言 & 开发_Zef Hemel_InfoQ精选文章