2014-09-12 2 views
1

я прохожу эликсир «Приступая к работе» учебник, в котором используется следующий фрагмент кода:Ошибка синхронизации в учебнике Elixir GenServer?

test "removes buckets on exit", %{registry: registry} do 
    KV.Registry.create(registry, "shopping") 
    {:ok, bucket} = KV.Registry.lookup(registry, "shopping") 
    Agent.stop(bucket) 
    assert KV.Registry.lookup(registry, "shopping") == :error 
end 

Теперь create/2 использует cast операцию, тогда как lookup использует call. Таким образом, это означает, что выполняется асинхронный вызов, а затем сразу же после этого успешно выполняется синхронный вызов, предполагающий асинхронное действие. Могут ли временные проблемы привести к сбою теста, когда сам код верен, или есть ли какой-то аспект cast и call, что мне не хватает?

ответ

3

Поскольку процесс GenServer обрабатывает все сообщения последовательно, вызов lookup блокируется до тех пор, пока не завершится предыдущий cast, поэтому не должно быть проблем с синхронизацией.