2015-09-03 21 views
3
Enum.each(1..100, fn(i)-> 
    spawn(fn-> IO.puts(i) end) 
end) 

spawn(fn-> IO.puts("HELLO") end) 

我期望第一部分輸出1 - 100到屏幕上,但它什麼都不做。如果我沒有在第二行使用spawn,並且只是說IO.puts(i),它可以正常工作 - 所以IO.puts在each調用中工作正常。 HELLO部分工作正常,所以IO.puts在一個產卵區內工作正常。但是這種組合什麼也沒有。爲什麼IO.puts不適用於Enum.each中的派生?

這是爲什麼?

+1

我在iex中試過你的代碼,它適用於這兩個例子。 – Gjaldon

+0

我可以證實@Gjaldon說了什麼。 –

+0

我使用Ctrl-B選項從Sublime文本中運行'.exs',它的行爲就像OP說的那樣。另外,如果我使用'elixir test.exs',那麼OP報告的問題就會發生 –

回答

2

注:如果保存代碼在.exs文件,並在命令行中使用elixit <file-name>.exs


spawn/1需要,它會在另一個執行函數來運行這個問題可以被複制處理。該功能完成

後,你的情況

衍生進程將執行給定功能和退出,運行該代碼的父進程的子進程結束之前能完成它們的執行。

如果再加上睡眠,那麼,我們將看到輸出:

Enum.each(1..100, fn(i)-> 
    spawn(fn-> IO.puts(i) end) 
end) 
spawn(fn-> IO.puts("HELLO") end) 

:timer.sleep(1000) 

你不會看到這個問題iex的,在這種情況下,運行spawn編輯過程中的父進程是iex本身它會一直活着直到你退出。

相關問題