Я новичок в Erlang, поэтому, пожалуйста, будьте со мной полегче.
Я смущен тем, как оператор получения выполняется в erlang, например:
loop() ->
receive
MessageA -> handlerA();
MessageB -> handlerB()
end
Если получено MessageA и выполняется обработчик A, через некоторое время в папку «Входящие» процесса поступает MessageB, выполняется ли обработчик B?
Я думаю, что нет, так как я вижу много кода, который рекурсивно выполняет оператор получения снова:
loop() ->
receive
MessageA ->
handlerA(),
loop();
MessageB ->
handlerB(),
loop()
end
Но вот проблема, если обработчик messageA включает другой оператор получения, подобный этому:
loop() ->
receive
MessageA ->
loop2(),
MessageB ->
handlerB(),
loop()
end
loop2() ->
receive
MessageC ->
handlerC()
loop2()
MessageD ->
handlerD()
loop2()
end
В этом случае означает ли это, что если я войду в обработчик MessageA, я никогда не смогу обработать MessageB?
И как я могу это решить? Поместив обработчик MessageB в loop2? Это выглядит не очень изящно, особенно при наличии нескольких уровней операторов получения.
Есть лучший способ сделать это?