【问题标题】:Clojure: how much asynchronity is necessary in a process pipeline?Clojure:流程管道中需要多少异步?
【发布时间】:2015-06-09 19:55:47
【问题描述】:
在 Clojure 中,您可以通过 comp 在同步 (->) 或异步 (~>) 绑定在一起的多步流程中构建涉及步骤 (s)、一些昂贵的 (S) 的管道或chan。我正在尝试了解避免阻塞和提高性能所需的通道粒度。
我们可以使用通道来连接每一步,但这似乎是不必要的开销。
~> s ~> s ~> S ~> s
或者我们可以预先使用单个通道并同步组合其他步骤。在我看来,这足以避免阻塞主进程。
~> s -> s -> S -> s
我认为这与:
~> S
人们更喜欢更多而不是更少的频道吗?为什么?
我认为第二个示例类似于在浏览器中调用 web worker,因为一旦跨越边界,后端位的连接方式不会对主线程产生太大影响。
【问题讨论】:
标签:
multithreading
asynchronous
clojure
functional-programming
web-worker
【解决方案1】:
您不会通过拆分同步步骤并通过通道同步运行它们来获得性能 - 无论您在多少线程、工作程序或机器上运行这些步骤。相反,由于必要的协调开销,您会降低性能。
单个步骤的成本有多高并不重要。选择重构到通过通道同步的进程中没有任何粒度点更可取。
当计算要求其步骤同步执行时,即。 e.一个步骤需要上一步提供结果,同步执行它们是你能做的最好的事情。
在您希望暂停计算直到它可以继续处理由一个或多个输入源提供的数据的情况下,通道非常有用。这允许将非确定性事件考虑在内,例如决定在运行时首选一个输入源,因为它恰好在另一个之前可用。
作为一种协调工具,渠道永远不会提高性能。你可以用频道做的所有事情都可以在没有频道的情况下获得更好的性能。但这通常很乏味且更容易出错。此外,如果没有像通道这样的设计约束,多个线程的正确同步是极其困难的。这就是为什么在大多数情况下,轻微的开销是一个便宜的代价。