Переменные связываются один раз в Erlang

Изменить: я изменил название этого вопроса, так как он был бесполезен в свете ошибки n00b, которую я сделал. Остаток остается неизменным и служит предостережением!

Я использую Erlang OTP версии 17.4. Рассмотрим следующий сеанс оболочки Erlang, где я экспериментирую с trap_exit флаг процесса, как объяснено в разделе "Изучаем некоторые ошибки: ошибки и процессы".

Во-первых, я установил trap_exit флаг для преобразования сигналов выхода в связанных процессах в обычные сообщения:

Eshell V6.2  (abort with ^G)
1> process_flag(trap_exit, true).
false

Затем я порождаю связанный процесс и немедленно завершаю его вызовом exit/2:

2> exit(spawn_link(fun() -> timer:sleep(50000) end), kill).
true

Затем я прочитал преобразованное сообщение о выходе:

3> receive X -> X end.
{'EXIT',<0.61.0>,killed}

Пока все выглядит хорошо, как описано в книге. Теперь просто ради удовольствия spawn_link и завершить другой процесс:

4> exit(spawn_link(fun() -> timer:sleep(5000) end), kill).
true

И попробуйте прочитать преобразованное сообщение о выходе:

5> receive X -> X end.

В этот момент оболочка висит. Мой вопрос: почему поведение меняется во время второго обхода и куда делось сообщение о выходе?

1 ответ

Решение

Ваш второй receive X -> X end. уже имеет X связаны; он пытается получить сообщение, точно совпадающее с тем, которое вы уже видели. Поскольку pid будет другим, сообщение никогда не будет совпадать. Так что зависает, ожидая того, что совпадет.

Вам нужно f(X) первый.

Другие вопросы по тегам