Неанонимная функция внутри spawn не выполняется асинхронно - PullRequest
0 голосов
/ 06 октября 2018

Так вот мой код:

 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 голосов
/ 06 октября 2018

Использование spawn(&fun/0).

То, что вы сейчас делаете, оценивает fun и передает результат в spawn.Вот почему он ожидает завершения fun, а затем отправляет :ok (что является ответом от IO.puts("sleep over") - последнее выражение в fun) для появления.В этом и заключается ошибка :erlang.spawn(:ok).

Вы должны захватить функцию и передать ее в качестве аргумента spawn Читать Захват функции

...