2016-02-17 36 views
0

我想知道是否可以(并建议!)在F#代理上实现CSP。我想,如果F#已经拥有了它,工作好,那么也许有可能只是提供了一个API来模拟CSP与渠道,ALT和同类者...如何在F#代理之上实现CSP?

的主要问题是,代理是异步和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上发现了一种酏剂。

+2

你的意思是CPS? –

+0

@NikosBaxevanis我认为他指的是沟通顺序过程:https://en.wikipedia.org/wiki/Communicating_sequential_processes – egerhard

回答

1

Wikipedia article on Communicating Sequential Processes (CSP)有一个很好的部分,详细描述了CSP和Actor模型之间的关键区别(F#代理基于Actor的并发模型)。您绝对需要解决的两个突出问题是同步与异步通信,写入通道与直接写入流程。

这可能是可能的,但看起来很难。在最基本的层面上,CSP需要在进程间完全同步的通信,而F#代理(MailboxProcessor)是异步的,所以你必须建立一个系统来强制F#代理之间的同步通信。可能的解决方案可能是使用PostAndReply函数。

下一个主要区别(也许是最难克服的):CSP写入特定频道,而F#actor模型将消息写入特定的演员。换句话说,如果你有两个进程AB:与F#代理A将被明确地说B.post(<msg>)发送消息,而在CSP A会写一个消息,一个名为chanB通道将被告知从通道明确阅读名称为chan(请注意,在CSP中,通信渠道与流程无关,而在F#代理模型中,通信渠道与接收代理相同)。这似乎是一个更难以克服的差异。只是在那里抛出一些想法(我不知道它是否可以很好地工作):一种可能性是重新思考F#代理所代表的内容:代理不像代理那样充当CSP通道。

对于任何对CSP感兴趣的人来说,Clojure的core.async基于CSP,而Brave Clojure有一个pretty good tutorial,这有助于解释CSP的工作原理。

+0

我已经理解了CSP与代理之间的主要区别。我只是更喜欢CSP的工作方式,并且因为F#*已经*有代理人想知道如何在另一个中转动一个。 – mamcx

+0

“,而不是让代理充当进程,代理充当CSP通道。”我在想同样的事。在某些方面,这听起来像频道会像pub-sub一样。 – jpierson