InfoBus (для программистов)
Apr. 3rd, 2007 02:01 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я уже очень давно написал совсем маленькую библиотеку на Java, которая называется InfoBus и позволяет множеству threads (здесь я их называю service threads) асинхронно посылать друг другу сообщения.
Звучит просто, даже слишком, но библиотека эта оказалась настолько полезной и универсальной, что я таскаю её за собой из проекта в проект и с одной работы на другую уже много лет (постепенно изменяя по ходу дела), и вообще не представляю, как можно какую-либо multithreading-программу написать на Java без неё. В общем, я наконец-то собрался сделать для неё документацию и примеры и выложил на сайт.
Конечно же, подобные библиотеки наверняка существуют, но эта моя собственная, и она мне очень нравится. Я использовал её уже в четырёх проектах - двух GUI, одном сервере, который работает с китайской биржей и одном proxy-сервере, который нужен мне для программы визуализации, о которой я как-то уже писал.
Библиотека основана на трёх основных принципах:
1) Service threads никогда не блокируют друг друга;
2) Они всегда спят, когда нет работы;
3) Работа появляется, когда один из сервисов посылает другому communication queue item. Этот-то item и заключает в себе логику программы, которая должна выполняться в контексте того service thread, которому послано сообщение.
Таким образом, сами service threads "ничего не знают" о той работе, которую они выполняют - они просто просыпаются, когда обнаруживают очередной item в своей очереди, вызывают его метод execute и засыпают дальше.
(И ещё у service thread работает failover: если один из сервисов вдруг упал, он будет тут же запущен снова).
Всё это и в самом деле ужасно просто, но тем-то оно и сильно! Призываю всех, кто пишет на Java, попробовать. Подробное описание, API и download здесь.
Там же есть и простые примеры. Вчера я сделал пример "обедающих философов" и прокрутил для 1000 философов (то есть 1000 service threads). Работает всё очень хорошо.
Напишите мне, если кто-то будет пользоваться!
Про философов
Date: 2007-04-03 06:06 am (UTC)Re: Про философов
Date: 2007-04-03 06:29 am (UTC)Re: Про философов
Date: 2007-04-03 04:39 pm (UTC)Re: Про философов
Date: 2007-04-04 12:51 am (UTC)Строгое решение предписывает не просто будить своих соседей, а проверять, что каждый из соседей 1) голоден (т.е. не находится в состоянии thinking или eating), и 2) обе вилки голодного соседа свободны. Причём философ не просто будит соседа, отвечающего этим условиям, а ещё и сам выставляет его состояние в "eating". То есть, в этом случае, вместо посылания сообщения WakeUp (которое неизвестно ещё когда придёт), мне нужно было бы просто менять переменную внутри объекта Philosopher, а я хотел этого избежать.
Моё решение можно считать lightweight и не строгим. Хотя статистическая проверка показывает, что все философы едят примерно одинаковое количество раз.
Re: Про философов
Date: 2007-04-03 07:10 am (UTC)Re: Про философов
Date: 2007-04-03 05:24 pm (UTC)Re: Про философов
Date: 2007-04-04 12:31 am (UTC)