2014-12-01 89 views
3

我知道,你可以簡單的瓶坯消息如下傳遞:是否可以向Erlang的未註冊流程發送消息?

self() ! hello. 

,你可以看到消息致電:

的flush()。

我還可以創建功能簡單的過程喜歡的東西:

spawn(module, function, args). 

但是我不明白怎麼可以將消息發送到流程與出注冊的PID。

我所看到的例子顯示,你可以在外殼與此模式匹配得到的PID分配給一個變種,所以如果我創建了一個gen_server如:

... 
start_link() -> 
    gen_server:start_link(?MODULE, init, []). 

init(Pid) -> 
    {ok, Pid}. 
... 

然後我就可以用調用它從shell執行以下操作:

{ok, Pid} = test_sup:start_link(). 
{ok,<0.143.0>} 
> Pid ! test. 
test 

所以我的問題是,你可以發送郵件到PIDS形式< 0.0.0>與出皆稱在殼體中的原子或變量?試驗和檢索證明是徒勞的...

回答

4

如果您碰巧需要根據其Pid的文本表示形式發送消息給Pid,那麼可以這樣做(假設字符串爲「< 0.42.0>」) :

list_to_pid("<0.42.0>") ! Message 

這幾乎是唯一的外殼(在這裏你可以看到日誌信息的輸出或監視來自像觀測數據)非常有用;任何產生的過程通常應該是與其相關聯(或被監控)的某種形式的父過程的孩子。

至於直接將消息發送到你剛纔催生,spawn返回一個PID控制,所以你可以給它分配給一個變量(這是一樣對其進行註冊):

Pid = spawn(M, F, A), 
Pid ! Message. 
+1

確實。要麼你有辦法在你的代碼流中以某種方式檢索Pid(例如將它保持在你的循環/進程狀態),或者你需要註冊它來再次找到它。您也可以將PID存儲在數據庫中(例如ETS或Mnesia,在內存中)。 – 2014-12-01 21:06:04

+0

我曾經使用過ETS跟蹤過程,似乎是一個很好的方法,因爲我是新來的Erlang,所以有一些好的意見。感謝您的澄清 – Opentuned 2014-12-01 21:40:23

+1

@Opentuned如果您以前發現ETS表對此有用,您可能需要查看「pg2」(http://www.erlang.org/doc/man/pg2.html,http:// pdincau.wordpress.com/2012/01/12/a-survival-guide-on-pg2-erlang-module/),'global'(http://www.erlang.org/doc/man/global.html)和'gproc'(https://github.com/uwiger/gproc)。 – zxq9 2014-12-01 22:58:04

1

如果你有字符串「」識別PID,它是

  • 或者是因爲你是在外殼的工作,和你用你看到的表現,你忘了該PID存儲在一個變量。然後,只需使用pid(X,Y,Z)來獲取它;
  • 要麼因爲你做了類似io_lib:format(「〜p」,[Val])其中Val是pid或包含此pid的erlang項。然後簡單地將pid分配給一個變量(直接或從術語中提取)。它可以存儲在ets中,發送到另一個進程而無需轉換

您應該避免使用shell(或字符串)表示。其中一個原因是,如下一個屏幕截圖所示,當您詢問來自2個不同節點的一個進程的PID時,此表示方式會有所不同。

enter image description here

+0

感謝您的觀點,您是對的,這是因爲我在shell中工作,因爲我正在學習繩索......我沒有變量來與Pid一起工作的原因是我習慣於使用寄存器命令,但是我正在與OTP頂級主管合作,並使用proc_lib:start_link和proc_lib:init_ack來獲得爲OTP sup所確認的適當進程,但這是從問題的初始範圍離題。如果我無法取得進展,可能需要稍後再發布。謝謝! – Opentuned 2014-12-02 18:23:18

相關問題