【锁定直播】字节、华为云、阿里云等技术专家讨论如何将大模型接入 AIOps 解决实际问题,戳>>> 了解详情
写点什么

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

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

关注

评论

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

Github星标57.9K!阿里巴巴Java面试突击汇总(全彩版)首次公开

程序员小毕

程序员 程序人生 JVM 多线程 Java 面试

P9力鉴!Alibaba9月最新出品776页JDK源码+并发核心原理解析小册

程序知音

Java 架构 jdk 并发编程 后端技术

活动预告 | AI for Good 2022 峰会

第四范式开发者社区

机器学习 数据库 开源 时序数据库 特征

开源机器学习数据库 OpenMLDB:线上线下一致的生产级特征平台

第四范式开发者社区

人工智能 机器学习 数据库 特征 开源、

多图详解kafka生产者消息发送过程

石臻臻的杂货铺

Kafk Kafka实战 10月月更

牛啊牛啊,这篇Spring Cloud Alibaba笔记一应俱全,几乎涵盖了所有操作

小二,上酒上酒

spring spring cloud alibaba

惊为天人,百度推出的Redis笔记真的太香了

小二,上酒上酒

redis 面试

来了来了,阿里p9整理的Netty速成笔记,应有尽有

小二,上酒上酒

Netty

耗时182天肝出来1015页分布式全栈手册太香了

程序知音

Java 程序员 架构 分布式 后端技术

【融云出海白皮书免费看】出海洞察之美国的「高线市场模型」

融云 RongCloud

互联网 数据 模型

【转载】Byzer + OpenMLDB 实现端到端的,基于实时特征计算的机器学习流程

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

五面腾讯,六h灵魂拷问,终拿下 58W offer

程序知音

Java 腾讯 java面试 后端技术 Java面试八股文

太牛了,这份Spring Cloud Alibaba学习文档清晰全面,一应俱全

小二,上酒上酒

spring Spring Cloud

全网独家首发Java面试题,包含Spring全家桶+高并发+Netty+Redis+Dubbo等面试专题

小二,上酒上酒

Java Linux Netty 高并发 Spring全家桶

Vector、ArrayList、LinkedList的区别

zarmnosaj

10月月更

浅谈云安全和传统安全

HummerCloud

云计算 云原生 云安全

阿里内部整理的Spring boot保姆级笔记,简直太牛了

小二,上酒上酒

spring springboot

活动预告 | Feature Store Summit 2022

第四范式开发者社区

机器学习 数据库 开源 时序数据库 特征

SAP | 在abap开发过程中常用的Tcode

暮春零贰

SAP abap 10月月更

【一Go到底】第十二天---switch

指剑

Go Goalng 10月月更

澳鹏Appen田小鹏博士:以高质量数据赋能AI驱动的元宇宙时代

澳鹏Appen

人工智能 AR/VR 训练数据 元宇宙 数据训练

成功实践丨基于昇腾,安擎助力天津银行开启加速度

科技热闻

数据中台建设5大关键步骤

阿泽🧸

数据中台 10月月更

阿里出品的这份Java性能调优实战手册,直接涨薪25K,真的香啊

小二,上酒上酒

Java 阿里 阿里面试

全网疯传,SpringBoot笔记(全彩版)顶翻天

程序知音

Java spring 源码 springboot 后端技术

六个方法教你如何搭建产品的在线帮助中心

Baklib

产品 帮助中心

Baklib知识分享|企业办公必备利器,在线协作文

Baklib

在线协作文档

腾讯资深架构师整理出来的Java高级开发需要的分布式技术,简直绝了

小二,上酒上酒

Java 编程 JAVA开发

这份神仙级Spring Security源码手册,真的很强悍

小二,上酒上酒

spring spring security springboot

还不懂Spring?阿里架构师整理的Spring宝典助你一臂之力

小二,上酒上酒

spring spring cloud ali spring宝典

连接团队知识孤岛,优化团队工作流程

Baklib

知识管理 知识库

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