我想知道是否有可能(并且可取!)在F#Agents之上实现CSP。我认为如果F#已经拥有它并且运行良好,那么也许可以提供一个API来模拟CSP与频道,ALT和类似...
主要的麻烦是Agent是异步的,而CSP是阻塞的。或者如何在F#中实现CSP?
P.D:我找到了https://github.com/Hopac/Hopac,但希望知道如何实施它,学习并尽可能避免依赖。
P.D 2:我在http://blog.plataformatec.com.br/2014/10/playing-with-elixir-and-go-concurrency-models/和erlang https://gist.github.com/kachayev/5426175找到了一个长生不老药样本。
答案 0 :(得分:1)
Wikipedia article on Communicating Sequential Processes (CSP)有一个很好的部分,详细说明了CSP和Actor模型之间的关键差异(F#Agents基于并发的Actor模型)。您绝对需要解决的两个差异是同步与异步通信和写入通道而不是直接写入流程。
这可能是可能的,但看起来很困难。在最基本的层面上,CSP需要在进程之间进行完全同步通信,而F#代理(MailboxProcessor)是异步的,因此您必须构建一个强制F#代理之间进行同步通信的系统。可能的解决方案可能是使用PostAndReply
函数。
下一个主要区别(也许是最难克服的):CSP写入特定通道,而F#actor模型则将消息写入特定actor。换句话说,如果您有两个进程A
和B
:使用F#代理A
将在CSP B.post(<msg>)
中明确说出A
来发送消息会给一个名为chan
的频道写一条消息,而B
将被告知明确地从名为chan
的频道中读取(请注意,在CSP中,通信的频道与进程无关,而在F#代理模型通信通道与接收代理相同)。这似乎是一个难以克服的难度差异。只是投掷和想法(我不知道它是否真的会运作良好):一种可能性可能是重新考虑F#代理代表什么:而不是让代理充当流程,代理充当CSP渠道
对于对CSP感兴趣的人,Clojure的core.async基于CSP,而Brave Clojure有pretty good tutorial,可以帮助解释CSP的工作原理。