Параллельный доступ к данным как в Haxl и Stitch
Это продолжение моего предыдущего вопроса.
Как я понял из Haxl и Stitch, они используют монаду для доступа к данным. Монада - это дерево команд доступа к данным. Дочерние - это команды, от которых зависит узел. Братья и сестры исполняются одновременно.
Бизнес-логика создает монаду, а затем отдельную функцию fetch
интерпретирует это.
Теперь вопрос: предположим, я выполняю несколько операций доступа к данным одновременно. Я могу использовать аппликативный функтор (не монаду), который представляет собой просто список команд (не дерево).
Имеет ли это смысл? Что если список содержит дублирующиеся команды?
1 ответ
Я думаю, что при построении Fetch
В значениях исключается возможность повторения одного и того же запроса, даже в одном раунде запросов (когда вы говорите "братья и сестры"). Если вы посмотрите на документ, рисунок 4 объясняет реализацию dataFetch
, который является конструктором Fetch
ценности. Это объясняет три возможности:
- Запрос никогда не был сделан раньше
- Запрос был сделан до И он был выполнен
- Запрос был сделан ранее, но еще не завершен
В последнем случае вы заметите, что возвращаемое значение имеет пустую последовательность BlockedRequest
с, потому что в этом случае некоторые другие Blocked
принеси это. Таким образом, когда ap
функция вызывается с этим значением, она не будет объединять один и тот же повторный запрос.
Кстати, я пытался реализовать Haxl в Scala здесь.