spawn中的非匿名函数不是异步执行的

时间:2018-10-06 10:56:56

标签: elixir

这是我的代码:

 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中的其他两个函数都是异步执行的(正如我预期的那样)。

1 个答案:

答案 0 :(得分:6)

使用spawn(&fun/0)

您现在正在评估fun,并将结果传递给spawn。这就是为什么它等待fun完成然后发送:ok(这是IO.puts("sleep over")的响应-fun中的最后一条语句)产生的原因。 这就是错误:erlang.spawn(:ok)的原因。

您必须捕获函数并将其作为参数传递给spawn 继续阅读Function Capturing