写点什么

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

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

关注

评论

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

Audirvana for Mac(音乐播放器)v3.5.50中文激活版

iMac小白

WiFi7 IPQ9574-IPQ9554-QCN9274-QCN6274-space-time Block Code technology

wifi6-yiyi

ipq9574

都2023年了,你还不会 CI/CD 吗?

伤感汤姆布利柏

ci CD

BetterMouse for Mac中文激活版下载(鼠标增强软件)

iMac小白

re:Invent 2023:PingCAP 荣获亚马逊云科技 2023 年度合作伙伴奖项

PingCAP

数据库 AWS TiDB 亚马逊云科技 pingCAP

你知道Spring中BeanFactoryPostProcessors是如何执行的吗?

EquatorCoco

spring 后端 springboot

BatchOutput PDF for Mac(PDF文件批量打印软件)v3.1.1激活版

iMac小白

uniapp开发App从开发到上架全过程

雪奈椰子

Android 实现APP可切换多语言

EquatorCoco

APP开发 Andriod开发

Royal TSX for Mac(远程管理软件)6.0.2激活版

Geek_幻墨成诗

Royal TSX MacOS远程管理

E往无前 | 让你的ES查询性能起飞!腾讯云大数据ES查询优化攻略“一网打尽”

腾讯云大数据

ES

软件测试/人工智能|为什么Python在人工智能时代异军突起

霍格沃兹测试开发学社

Redis Desktop Manager for Mac(Redis桌面管理工具)中文激活版

Geek_幻墨成诗

RESP

iZotope RX 10 for mac v10.4.2 激活版

Geek_幻墨成诗

iZotope RX 10下载 iZotope RX 10破解版 iZotope RX 10 mac iZotope RX 10

Rhinoceros 8 for Mac(犀牛8 mac版)激活版

Geek_幻墨成诗

Rhinoceros 7 Rhinoceros8

「智造」第10期:浅谈工业互联网加速企业服务化转型

用友BIP

智能制造

速速报名!请查收 2023 龙蜥操作系统大会超全指南

OpenAnolis小助手

开源 龙蜥社区 北京 2023龙蜥操作系统大会

MindNode 5 for Mac(思维导图) v5.0.1中文激活版

mac

思维导图软件 苹果mac Windows软件 MindNode 5

软件测试/人工智能|一文告诉你LangChain核心模块chains原理

霍格沃兹测试开发学社

DAPP合约区块链技术项目系统开发

l8l259l3365

全力备战中国大学生计算机设计大赛!历年获奖作品正式上线和鲸社区

ModelWhale

Python 云计算 算法 数据分析 中国大学生计算机设计大赛

软件测试/人工智能|LangChain核心模块Agents详解

霍格沃兹测试开发学社

PingCAP 被评为 Translytical Data Platforms 2023 全球技术领导者

PingCAP

数据库 TiDB

特权账号管理之金融行业篇

尚思卓越

网络安全

Cycling 74 Max for Mac下载 音乐可视化编程软件

iMac小白

Last Week in Milvus

Zilliz

非结构化数据 Milvus Zilliz AIGC 向量数据库

用行云管家实现IT统一运维管理,提高运维效率

行云管家

IT运维 行云管家 运维管理 统一运维

上海统一运维管理平台推荐-行云管家

行云管家

IT运维 运维管理 统一运维

异常追踪与 JIRA 实现双向联动最佳实践

心有千千结

可观测性 Jira

每日一题:LeetCode-165. 比较版本号

Geek_4z9ami

Go 面试 算法 LeetCode 每日一题

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