Каковы преимущества обещаний clojure перед использованием add-watch? - PullRequest
7 голосов
/ 07 января 2011

Я смотрю на различные способы реализации параллелизма в clojure, и кажется, что это два конкурирующих способа сделать одно и то же, поэтому мне было интересно, где мне использовать каждую технику.

Ответы [ 2 ]

10 голосов
/ 07 января 2011

Часы - это одна сущность в параллельной системе, а обещания - это две сущности.

обещания - это больше способ общаться между событиями в разные сроки. Они дают возможность фрагменту кода получить ответ, не беспокоясь о том, какой механизм будет предоставлять ответ. исходный путь к коду может создать обещание и передать его двум различным путям кода в одном потоке, или потоках, или агентах, или узлах в распределенной системе. затем, когда один из потоков / агентов / ссылок нуждается в ответе, он может заблокировать обещание без необходимости что-либо знать о сущности, которая будет выполнять обещание. И когда другой поток / агент / ref / other выясняет ответ, он может выполнить обещание без необходимости что-либо знать о сущности, которая ожидает обещания (или еще не ожидает).

обещания - это механизм связи по временным шкалам, которые не зависят от используемого одновременно механизма.

Часы - это способ указания функции, вызываемой при изменении атома или ссылки. это способ сообщить о намерении всем будущим состояниям одного агента / ref , сказав: «Эй, убедитесь, что это условие всегда верно», или «зарегистрируйте изменение здесь».

5 голосов
/ 08 января 2011

Часы и обещания очень полезны для параллелизма, но подходят для немного другого использования. Вы можете обнаружить, что хотите использовать оба в разных местах в одном приложении.

Используйте часы, если хотите уведомление об изменении в ссылке . Например, если один поток обрабатывает события и обновляет ссылку в ответ на некоторые из этих событий, вы можете использовать add-watch, чтобы другие части вашей системы могли получать уведомления об обновлении. Одни часы могут обрабатывать множество обновлений с течением времени.

Используйте обещание, если вы хотите передать другому потоку дескриптор для доступа к значению, которое еще не вычислено . Если другой поток попытается разыменовать обещание, они будут блокироваться до тех пор, пока не будет завершено вычисление обещания (то есть исходный поток помещает значение в обещание через «доставку»). Одно обещание предназначено для использования только один раз - после этого это просто фиксированное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...