Haskell Thread Communication Pattern Scenario

У вас есть два потока, a и b. Поток a находится в вечном цикле, слушая блокирующий сокет 1. Поток b также находится в вечном цикле, слушая блокирующий сокет 2. И сокет 1, и сокет 2 могут возвращать данные в произвольное время, поэтому поток a может вечно спать в ожидании данных, в то время как поток b постоянно получает данные от сокета и продолжает свою обработку. Такова предыстория.

Теперь предположим, что им нужно совместно использовать словарь. Когда поток a получает какие-то данные (если вообще получает), он добавляет пару ключ-значение в словарь после некоторой обработки, а затем продолжает ждать новых данных. Когда поток b получает данные из своего сокета, он сначала запрашивает словарь, чтобы узнать, есть ли там информация, связанная с полученными данными, прежде чем продолжить обработку. В словаре нет удалений, только вставки и запросы (мне было бы интересно, имеет ли это значение для конечного решения).

В стандартном императивном языке, таком как python или c, это довольно легко сделать, сделав словарь доступным в обоих диапазонах и запрашивая его только после того, как поток получил блокировку, так что поток B всегда видит самый (ну почти) актуальный словарь.

В Haskell, похоже, мне никак не удается придумать хорошую реализацию этого паттерна. MVar может иметь только один элемент за раз, поэтому не может быть так, что поток a помещает словарь, поскольку может произойти новое обновление, и он не сможет подтолкнуть этот новый словарь, пока поток b не получит его из MVar. С другой стороны, если поток b использует MVar для отправки сигнала готовности "ok!" потоку a, может случиться так, что поток a будет спать на своем сокете чтения, поэтому он не сможет отправить данные обратно, пока его сокет чтения не разблокируется! Существуют также каналы, но это кажется беспорядочным, поскольку мне придется постоянно посылать новые словари, а поток B будет отбрасывать все, кроме последнего.

Альтернативное решение, которое могло бы работать, - это просто посылать обновления по каналу, а потоку B строить словарь для себя. Однако мне интересно, есть ли лучшие альтернативные решения.

Спасибо, что нашли время прочитать этот очень длинный вопрос!

11
задан Anil Vaitla 2 January 2012 в 21:06
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: