相当于Clojure / Java中的Goroutines

2022-09-02 22:10:08

我最近喜欢看Google IO关于Go并发模式的演讲

尽管 Go 方法的并发性(groutines、通过通道进行通信)显然与 Clojure(不可变性、管理引用、STM)不同,但在某些情况下,Go 方法似乎在 Clojure 上下文中仍然有用。

那么,在Clojure或Java中,对于Go的并发原语(可能是一个库),是否有直接的等价物,特别是:

  • channel-像对象一样,阻塞直到读取器和写入器在两端都可用
  • 一个类似结构,可以在多个通道上等待结果select

附言对Java解决方案非常满意,因为它很容易从Clojure使用

更新由于最初提出这个问题,Clojure现在有core.async,它提供了所有这些功能以及更多功能。


答案 1

您应该查看core.async。这是一个由Rich Hickey编写的库,实现了go风格通道。


答案 2

类似通道的对象,阻塞,直到读取器和写入器在两端都可用

这有点令人困惑。你的意思是“阻止,直到,如果写作,一个读者可用,或者,如果阅读,一个作家可用”?我代表线程而不是构造说话,构造不能只阻止线程。(为避免混淆,构造将指示线程阻塞)。

如果我的假设是正确的,你可以有两个选择(在标准Java中)。

  1. 同步队列
  2. 传输队列(尽管这也可以用作缓冲通道)

类似 select 的构造,可在多个通道上等待结果

据我所知,没有任何真正的类似结构。您可以拥有的最接近的是执行器完成服务,它将在提交的下一个可用任务完成时返回。select


推荐