[英]Erlang function calls - Why does it not work to call self() as a direct argument?
當我們意識到這是問題時,我和我的朋友試圖在我們的代碼中找到一個錯誤。
random_function(spawn_link(fun() -> worker(List, self(), Death) end));
這是解決方案:
PID = self(),
random_function(spawn_link(fun() -> worker(List, PID, Death) end));
所以我的問題是,為什么不能直接調用self()函數呢? 是因為它是一個匿名函數還是某種特殊的Erlang?
它有點微妙。 self()
調用發生在fun()
內部。 由於它產生了它,它有另一個Pid而不是你期望的Pid。 因此,語義是不同的。
你應該知道spawn_link(fun() -> worker(List, self(), Death)
會創建一個新進程,我們只稱它為Pid1
,然后self()
代表Pid1
。
在第二種情況下,你可以在spawn
函數之外的Pid = self()
,所以self()
Pid
。
當您spawn/spawn_link
一個fun
那么的身體fun
的新工藝進行評估,而不是在產卵過程。 這就是你的第一種情況,在新進程中評估self()
調用,因此它不會返回你想要的值,即產生進程的pid。 但是,在第二種情況下,首先在產生過程中評估self()
,然后將該pid傳遞給新過程,這就是您想要的。
這實際上是一個常見的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.