2014-12-05 70 views
0

我在想一個Erlang程序有很多工人(循環接收),這些工人幾乎總是在同一時間操縱他們的狀態,即。大量的併發,工作量太大以至於他們在mnesia中的狀態會導致性能問題,所以我想在每個循環中將狀態作爲參數傳遞,然後在一段時間後寫入mnesia。這是一個很好的做法嗎?有一個更好的方法嗎? (粗略地說,我在尋找類似於面嚮對象語言中的屬性的實例)如何在Erlang中實現狀態?

謝謝。

+2

如果沒有一些想法,你無法回答這個問題,你實際上試圖用你的程序解決什麼問題。一般來說,大多數Erlang程序具有處理來自其他進程的請求的進程,這些程序只知道它們自己的狀態,並且狀態通過參數傳遞給遞歸循環。 – zxq9 2014-12-05 02:56:03

回答

0

對於Erlang來說,將進程看作具有專用和有限角色的角色是一種好習慣。考慮到這一點,你會看到你會在不同的類別,如分割你的問題:

  1. 保持與Internet上的用戶的連接狀態,
  2. 保留信息,如登錄,用戶的個人資料,好友,店鋪購物車...
  3. 日誌事件
  4. ...

每個你將不得不決定是否狀態信息必須生存過程中的作用。

在很多情況下,它不是必需的(情況1),解決方案只是將狀態保持在過程的循環函數的參數中。我鼓勵你看看OTP行爲,gen_server和gen_fsm就是爲此而做的。

案例2明顯處理永久數據,這些數據必須存活到進程崩潰甚至硬件崩潰。這些數據將使用dets,mnesia或任何適合您的問題的數據庫(Redis,CouchDB ...)進行存儲。

限制存儲在外部數據庫中的信息是很重要的,否則你將不會受益於這種非常強大的功能,這是缺乏副作用。換句話說,擁有依賴於外部信息的流程行爲是一個非常糟糕的想法。