问题标签 [core.async]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
598 浏览

macros - Clojure - 控制宏反转 - Timothy Baldridge

大约 12 分钟的 core.async 播客中,Rich Hickey 提到了由 Timothy Baldridge 编写的宏,它执行“控制反转”。该宏将代码重写为状态机。

有人有这个代码在 github 上的链接吗?

0 投票
6 回答
6032 浏览

clojure - core.async 不是违背 Clojure 原则吗?

我看到许多 Clo​​jure 程序员对新的 core.async 库充满热情,虽然它看起来很有趣,但我很难看出它是如何符合 Clojure 原则的,所以我有以下问题:

  1. 它在任何地方都使用可变状态,正如函数名称通过感叹号所暗示的那样,如 alt!、put!、>! 等。如果您从通道中放置或获取值,则该通道将被就地修改。这不是与 Clojure 偏好不可变数据结构、纯函数等的哲学相悖吗?还是 core.async 仅用于根本无法避免可变事物的情况?
  2. 由于“go”是一个宏(因此修改代码结构)并确保“<!” 直接在 go-block 中使用,不能使用 "<!" 在另一个函数中,像这样:

    在我看来,这妨碍了简单性和可组合性。为什么这不是问题?

  3. 也许是前两个问题的结果,很多带有 core.async 的代码都使用了低级结构,例如循环/递归,而不是 map/filter/reduce。这不是倒退一步吗?

我在哪里错过了重点?

提前致谢。

0 投票
3 回答
2062 浏览

multithreading - Clojure core.async,CPU 超时后挂起。无论如何要正确杀死 (go..) 块产生的宏线程?

基于core.async 遍历示例,我在下面创建了类似的代码,以使用多个通道处理一些 CPU 密集型作业,超时时间为 10 秒。但是在主线程返回后,CPU 使用率保持在 700% 左右(8 个 CPU 机器)。我必须在 emacs 中手动运行 nrepl-close 才能关闭 Java 进程。

是否有任何适当的方法可以杀死 (go..) 块产生的宏线程?我试过接近!每个chan,但它不起作用。我想确保主线程返回后Java进程的CPU使用率回到0。

0 投票
2 回答
3938 浏览

multithreading - Clojure core.async,有什么方法可以控制该(go ...)线程池中的线程数?

默认情况下 (go..) 将使用两倍的内核数 + 42 个 线程作为线程池。有什么方法可以通过设置环境变量或某事来设置代码可以使用的线程数或 CPU 数?

在 linux 机器上,我可以使用任务集设置 CPU数量,例如 taskset -c 0,1 my_Java_or_Clojure_program,尽管任务集似乎对返回的数量无效(-> (java.lang.Runtime/getRuntime) .availableProcessors)

0 投票
1 回答
1028 浏览

asynchronous - Clojure 的 core.async 是否类似于 Jane Street 的 OCaml Core Async?

在这篇文中,作者写道:

然而,Grenchman 是建立在 Jane Street 的 Core 和 Async 库之上的,Jane Street 是 OCaml 的最大工业用户之一。异步允许单子伪并发,避免了其他事件驱动工具的许多回调问题,但它是相当单一的。

Core Async 的 Jane Street 文档页面上,他们将其描述为:

特别是,我们认为 Async 在控制程序的并发性方面做得更好,更容易推理可能的竞争条件。

我的问题是——Clojure 中的 core.async和 OCaml 中的 Core Async有相似之处吗?我问是因为“避免回调头痛的虚假并发”听起来与 Clojure 中 core.async 的应用非常相似。

0 投票
1 回答
1120 浏览

clojure - 避免 go 宏限制的可能解决方案:必须在 (go ...) 块内调用

也许可以使用(<! c)宏及其宏扩展时间来完成使用外部宏的可能解决方案:

这是我的例子:

并对其进行测试:

我已经在嵌套中尝试过这个解决方案并且也可以工作。但我不确定它是否是正确的路径

这个问题的原因与另一个问题有关core.async 是否违反了 Clojure 原则?,@aeuhuea 评论说:“在我看来,这阻碍了简单性和可组合性。为什么这不是问题?” 和@cgrand 响应“go 宏(它的局部性)的限制也是一个特性:它强制执行有状态操作的源代码局部性。” 但是强制本地化您的代码与“完成”不同吗?

0 投票
1 回答
468 浏览

clojure - 扩展 clojure core.async 的功能

是否建议使用我自己的异步函数来扩展 core.async 的功能?

通道的异步性由其处理put!take!接受回调,但协议嵌套在async.impl.protocols命名空间中。impl是否意味着远离!在这种情况下,还是可以实施它们?

例如,我可以将 netty 通道或 java 套接字包装为 ReadPort 和 WritePort。

0 投票
5 回答
2838 浏览

clojure - clojurescript 找不到 cljs.core.async.macros

我在文件 client.cljs 中有以下代码:

项目文件如下所示:

...编译时给我这个错误:

请注意,我的代码是从这里复制的:https ://github.com/Dimagog/AsyncGET/blob/master/cljs/app.cljs这个人的项目具有相同的依赖项并且可以正常工作。

知道为什么吗?谢谢!

更新:我的 cljsbuild 是自动的。重新启动 cljsbuild 后,它编译得很好。谢谢!

0 投票
1 回答
2213 浏览

scala - 通信顺序过程 [CSP] 是 Scala 中参与者模型的替代方案吗?

Hoare 1978 年的一篇论文中,我们提出了一个名为 Communicating Sequential Processes 的想法GoOccam和 Clojure 中的core.async都使用了它。

是否可以使用 CSP 作为 Scala 中 Actor 模型的替代品?(我看到的是JCSP,但我想知道这是否是唯一的选择,它是否成熟,以及是否有人使用它)。

编辑 - 我还看到通信 Scala 对象作为 Scala 中 JCSP 的替代方案。但是这些似乎与真正的线程相关联 - 这似乎错过了 CSP 的好处之一,即摆脱保持大量线程始终处于活动状态的内存资源成本。

0 投票
3 回答
7847 浏览

java - 优雅地退出 Clojure core.async go loop on kill

我有一个顶级core.async循环。我希望它无限期地运行,至少在我用 CTRL-C 或kill或类似命令停止它之前。我目前正在使用java.lang.Runtime/addShutdownHook,如下所示:

这是我的问题:

  1. 如果我启动 REPL,(run)然后它在后台线程中启动并运行。当我退出 REPL 时,我没有看到所需的关闭消息。

  2. 但是,当我从 运行时lein run,go 循环立即退出并显示“SHUTDOWN”。

也不是我想要的。

我不一定期望找到适用于所有 JVM 的解决方案。我在 Mac 上开发并部署到 Ubuntu,所以我想找到一个适用于两者的解决方案:

  • Mac JVM:Java 版本“1.7.0_45”Java(TM) SE 运行时环境(构建 1.7.0_45-b18)Java HotSpot(TM) 64 位服务器 VM(构建 24.45-b08,混合模式)

  • Ubuntu JVM:java 版本“1.7.0_25”OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2) OpenJDK 64-Bit Server VM(build 23.7-b01,混合模式)