gpt4 book ai didi

Clojure core.async 放!与去 block

转载 作者:行者123 更新时间:2023-12-04 13:48:11 25 4
gpt4 key购买 nike

我在这里阅读了这篇关于 core.async 的精彩文章:

http://www.core-async.info/reference/primitives

我正在努力理解 put 的内部机制!去。我明白那个:

  • 放!是异步的,可以接受回调。这在简单的场景中效果很好,但你可以在回调 hell 中结束。
  • go 修复了回调 hell ,并允许以同步风格编写异步代码。
  • go 利用轻量级线程池,并利用 parking 来启用并发性。
  • go 使用有限状态机

  • 我不明白:
  • 怎么放!实现异步?它还使用线程池吗?
  • 放!还用 parking 场吗?
  • 有限状态机在 go block 中的作用是什么?是它使 parking 成为可能吗?
  • 我应该总是尝试使用put!而不是因为它更便宜而去?那样的话,是不是就意味着放!实现与 go 完全相同的并发性能,并且 go 仅在我想推理复杂的异步代码时使用?

  • 非常感谢你解开这些谜团。

    最佳答案

    如果您想了解 core.async channel 的工作原理,没有比 Rich Hickey 的 EuroClojure 2014 演示文稿更好的来源:Implementation details of core.async channels .

    至于你的具体问题:

  • 如果 put!不会立即被接受,它会在 channel 内部的队列中放置一个挂起的 put(要放在 channel 上的值 + put! 回调)。请注意,如果队列中没有空间,则会引发异常(最大容量当前固定为 1024)。

    如果 (1) 未立即接受 put 或 (2) 显式 false,则将在池线程上调用回调。作为 put! 的最终参数传入调用(此参数称为 on-caller? ,有关详细信息,请参阅 put! 的文档字符串)。
  • “ parking ”,在 go 的上下文中 block ,是指暂停执行 go通过记录其当前状态的某些细节并将它们保存在一个 channel 或可能的多个 channel 中,以便以后可以重新启动 block 的状态机。 (注意,这种安排意味着如果所有持有对挂起 go block 的引用的 channel 都被 GC'd,go block 本身也可以被 GC'd。)在其他上下文中,它类似地指的是放置一个线程控制处于假死状态。 put!只是一个函数(好吧,它由协议(protocol)方法支持,但那只是一个协议(protocol)方法),所以这个概念不适用。
  • 是的。它基本上是通过 go 中的代码进行的。 block ,当控制到达某些“自定义终端”( <!>!alt! )时,可能会暂停它。
  • 不一定,您应该首先考虑溢出内部队列的风险(参见上面的第 1 点)。
  • 关于Clojure core.async 放!与去 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341719/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com