2016-02-17 20 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