March 4th, 2012

with Cat The Cat

Небольшой опыт использования Хаскеля для параллельного программирования.

Хаскель не является серебряной пулей сам по себе. Это скорее снайперская винтовка с автоматическим ведением огня и набором боеприпасов.

Написал я программу, вроде, заработала. Подумал, что мне необходимо сделать определение тишины на нескольких каналах. Начал делать, а оно стало падать. Оказалось, что решение находится в районе Control.Concurrent.STM.TChan.

Это был единственный случай сбоя ментальной модели при работе с параллельными библиотеками Хаскеля.

Сделал, всё заработало. Однако при первом же серьёзном нагрузочном тестировании оказалось, что TChan слишком накладен. Подумав немного, я придумал замену прямому и тупому определению тишины. Оно должно было работать и с Chan и могло быть использовано в будущем для других систем обмена сообщениями. И реализовал. И всё начало потихоньку масштабироваться.

Чем ещё хорош Хаскель для параллельного программирования: в нём нет отладчика. Поэтому ловля и исправление ошибок идёт через чтение логов и вдумчивое пристальное вглядывание в код. В параллельной программе ошибки принципиально нельзя отлаживать, можно только наблюдать и понимать, что же произошло.
with Cat The Cat

И вдогонку.

Я использую слегка изменённые варианты Data.IntMap и Data.IntSet.

Я добавил в IntMap функцию получения IntMap из IntSet и значения. Это такой набор синглтонов получается. Аналог IntMap.fromList (zip (IntSet.toList) (repeat value)).

Структура и алгоритмы работы с ключами у (Int)Set и (Int)Map одинаковые. Поэтому преобразование совсем простое - скопировать структуру и добавить значения.

Что интересно, vshabanov тоже использует слегка модифицированные версии стандартных коллекций. Но про это пусть лучше он расскажет. ;)