我最近读了很多关于函数式语言的文章。由于那些只使用不可变结构,他们声称并发问题得到了极大的改进/解决。我在理解如何在现实生活中实际实现这一点时遇到了一些严重的问题。假设我们有一个 Web 服务器,其中一个线程在端口上侦听(好吧,IO 是另一件事,我很难理解,但现在让我们忽略它);在任何连接尝试中,都会创建一个套接字并将其传递给一个新创建的线程,该线程对其进行一些工作,并且根据接收到的通信,可能会将更改应用于服务器应用程序全局的大列表/数据结构。所以,
我的问题理解是:
- 显然,任何线程都可以获得列表的不变“快照”来处理。但是,在通过创建应用了更改的新版本列表来“更改”内容之后,我们仍然让每个线程都有自己的列表版本。这些是如何重新合并在一起的?
- 另一种方法可能包括使用传统的锁定机制,如 mutex/cond 或 go-like-channels。但是,当所有变量都是不可变的时,你怎么会创建这样的东西呢?
- 我听说过 STM,但是它不能处理副作用(即,如果列表也可以透明地将数据备份到文件或数据库中)
那么你将如何用函数式语言对这样的事情进行建模呢?