Я обрабатываю дерево и хочу ускорить его с помощью GPAR. Я использовал его для простых вещей, но не углублялся в более сложные варианты.
Предположим, что я обрабатываю разные ветви дерева их собственными потоками.
Скажем, у узла есть имя. Когда я нажимаю на этот узел в первый раз, я хочу, чтобы он был обработан (что включает запись в базу данных и т. Д.) И добавлен в кеш (здесь просто простая карта).
Мне нужны другие потоки, которые могут попасть в тот же узел (например, узел с тем же именем) в другом месте дерева, чтобы проверить кеш. Если он уже в кеше, они могут просто взять его и двинуться дальше. Если другой поток работает над обработкой этого узла в первый раз, я хочу, чтобы другие потоки, находящиеся на этом узле в своих ветвях, ожидали, прежде чем идти вниз по дереву (к другим вещам, которые зависят от того, что этот узел уже был обработан).
Узел извлекается из базы данных, поэтому это не один и тот же объект в каждой ветке, я не думаю, что синхронизированные методы будут работать.
Я, конечно, хочу, чтобы другие неродственные узлы продолжали обрабатываться.
Например:
- Поток 1 обрабатывает A-B-C-D
- Поток 2 обрабатывает E-B-F-G
- Поток 3 обрабатывает W-X-Y
- Поток 4 обрабатывает L-M-N-O-P-Q-R-S-B-J
Допустим, поток 1 сначала попадает в узел B. Он обнаруживает, что его нет в кеше, и начинает его обрабатывать.
Приходит поток 2 и видит, что узла B нет в кеше, но над ним работают. Таким образом, он ожидает перехода к узлу F, пока поток 1 не завершит обработку узла B.
Поток 3 не заботится об узле B и поэтому продолжает работать.
Поток 4 появляется позже, когда поток 1 завершает работу с узлом B и находит узел B в кеше, поэтому он просто извлекает его из кеша и переходит к узлу J.
Я ищу предложения о том, как лучше всего применить GPAR в этой ситуации.
Спасибо!