2011-03-02 120 views
2

我有一個erlang項目,其狀態是完全只讀的,由ets表和compiled module組成。代碼啓動時需要幾秒鐘的時間來構建表。是否需要OTP?

什麼是最好的方式打包這個,所以它可以被其他應用程序使用?

一些其他的事情要考慮:

  • 沒有數據爭用問題或改變狀態,所以好像沒有必要一個gen_server。
  • 我喜歡能夠打電話給application:start/1,並擁有「只是工作」的東西。
  • 某些進程應擁有ets表。看起來我不應該把它留給客戶端代碼。

上面的讓我覺得我應該創建一個應用程序,並調用來自上司的init/1功能設置代碼,但我不能確定這是否是接近它一個愚蠢的方式。

回答

5

如果模塊完全是靜態的,那麼在這樣的應用程序中不需要任何進程。如果在OTP中實現application行爲,則應該能夠將ETS表直接連接到主應用程序進程(啓動應用程序start/2回調中的表)。這樣您將擁有最小化的流程模型,從而可以跳過supervisorgen_server

您當然應該使用OTP,但這並不意味着您絕對必須擁有supervisorgen_server

使用appmon來查看應用程序的進程層次結構。

+0

我喜歡它!感謝您的意見。 :) –

+0

不客氣! –

+0

我只是去做這件事,並意識到開始回調需要返回'{ok,Pid}'。通常'Pid'是指最高管理者流程。如果在我的情況下不存在,我應該返回'{ok,self()}'嗎? –

2

把它包裝成一個標準的OTP應用程序。 gen_server不是關於維護狀態,而是關於有一個服務器可以處理請求(它不叫gen_state出於某種原因)。創建一個OTP應用程序,並讓人們以與其他任何應用程序相同的方式使用它。

+0

你能想到一個不應該只是普通模塊的無狀態'gen_server'的例子嗎?在過去,我一直認爲國家是使用這種行爲的先決條件。 –