智能体刷屏的背后,是 AI 应用拐点的来临?AICon 北京站议程重磅公布,50+ 硬核分享不容错过 了解详情
写点什么

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:576175
用户头像

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

关注

评论

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

稳定可靠,华为云服务器引领数字化时代

YG科技

面向对象编程的弊端是什么?

代码生成器研究

带键扫的LED专用驱动方案

芯动大师

华为云耀云服务器L实例:企业建站与小程序开发的新纪元

YG科技

低代码可以减少程序员哪些工作?

代码生成器研究

大模型+搜索:一盘跳棋和三位选手

脑极体

AI

华为云耀云服务器L实例:中小企业数字化转型的关键伙伴

轶天下事

打工人福音:未来每周只需工作3天?比尔盖茨这样评价AI...

代码生成器研究

为什么越来越多的企业选择IT外包服务?

Ogcloud

外包 IT 外包公司 外包项目 IT 运维

编程那么难,为什么不弄个大众一学就会的计算机

代码生成器研究

IT外包服务的未来发展趋势

Ogcloud

IT 外包公司 外包项目 IT 运维

小程序开发新选择!华为云耀云服务器L实例快人一步

YG科技

加速数智化升级,华为云这款服务器让企业上云更轻松

轶天下事

Open AI 砸了所有人的饭碗吗?

代码生成器研究

项目管理必备的时间轴软件!这10款协同工具有口皆碑。

彭宏豪95

项目管理 效率工具 在线白板 办公软件 绘图软件

如何编译你的C程序 | AI工程化部署

AIWeker

c AI工程化部署

什么是真正的低代码?

代码生成器研究

SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解

小万哥

MySQL 数据库 程序员 sql 后端开发

华为云耀云服务器L实例:中小企业小程序开发的高效解决方案

YG科技

音视频FAQ(一):视频直播卡顿

ZEGO即构

CDN RTC 实时音视频 音视频技术 直播间

咨询+低代码,强强联合为制造业客户赋能

明道云

MongoDB助力腾讯游戏 优化游戏开发体验

技术咖和技术渣

直播预告丨大模型如何在健康医疗中挖出大大的花?

京东科技开发者

人工智能 大模型

2023 IoTDB 用户大会倒计时 3 天 | 1 分钟让你了解 IoTDB!

Apache IoTDB

StarRocks 存算分离最佳实践,让降本增效更简单

StarRocks

数据库 数据分析 StarRocks

华为云耀云服务器L实例:中小企业数字化转型的加速器

轶天下事

企业上云请认准华为云这款服务器,数字化时代安全可靠的引擎

轶天下事

低代码平台在数字化转型过程中的定位

明道云

从零实现一个在线相亲APP(缓解相亲尴尬的神器)

音视频开发_AIZ

低代码就是不写代码吗?到底什么是真正的低代码平台?

代码生成器研究

关于 SLO,我们需要了解什么?

观测云

SLA SLO

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