所以这是我的代码:
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
Run Code Online (Sandbox Code Playgroud)
在运行此代码并执行各种虚函数时,我得到了这个输出:
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)>
Run Code Online (Sandbox Code Playgroud)
我主要担心的是,当我们使用spawn/1而不是匿名函数时,它不会异步执行函数,而是等待执行此函数,而在另外两个函数中,spawn内部的函数都是异步执行的(正如我所料).
使用spawn(&fun/0).
你现在正在做的是评估fun并将结果传递给spawn.这就是为什么它等待fun完成然后发送:ok(这是IO.puts("sleep over")- 最后一个语句的响应fun)生成.这就是错误:erlang.spawn(:ok)所在.
您必须捕获该函数并将其作为参数传递给spawn
Read on Function Capturing
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |