这是我的代码:
defmodule Test do
def fun() do
Process.sleep(10000)
IO.puts "sleep over"
end
def dummy(:b) do
spawn(fun())
end
def dummy(:a) do
spawn(Test,:fun,[])
end
def dummy() do
spawn(fn -> Process.sleep(10000)
IO.puts "sleep over"
end)
IO.puts "process started"
end
end
在运行此代码并执行各种虚拟功能时,我得到以下输出:
iex(1)> c("test.exs")
[Test]
iex(2)> Test.dummy
process started
:ok
sleep over
iex(3)> Test.dummy :
** (SyntaxError) iex:3: unexpected token: ":" (column 12, codepoint U+003A)
iex(3)> Test.dummy :a
#PID<0.111.0>
iex(4)>
nil
iex(5)>
nil
sleep over
iex(6)> Test.dummy :b
sleep over
** (ArgumentError) argument error
:erlang.spawn(:ok)
iex(6)>
我主要担心的是为什么当我们使用不带匿名函数的spawn / 1时,它不会异步执行该函数,而是等待该函数执行,而在spawn中的其他两个函数都是异步执行的(正如我预期的那样)。
答案 0 :(得分:6)
使用spawn(&fun/0)
。
您现在正在评估fun
,并将结果传递给spawn
。这就是为什么它等待fun
完成然后发送:ok
(这是IO.puts("sleep over")
的响应-fun
中的最后一条语句)产生的原因。
这就是错误:erlang.spawn(:ok)
的原因。
您必须捕获函数并将其作为参数传递给spawn
继续阅读Function Capturing