catpad: (Default)
[personal profile] catpad

Я уже очень давно написал совсем маленькую библиотеку на 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)
From: [identity profile] gianthare.livejournal.com
Я правильно понимаю, что у тебя решение без livelock, но со starvation?

Re: Про философов

Date: 2007-04-03 06:29 am (UTC)
From: [identity profile] catpad.livejournal.com
Нет, starvation быть не должно, потому что они друг другу не позволяют голодать, а вот что такое livelock я вообще не знаю...

Re: Про философов

Date: 2007-04-03 04:39 pm (UTC)
From: (Anonymous)
Как это не позволяют? Один из них может все время пробовать взять две вилки, не находить две свободные и возвращаться.

Re: Про философов

Date: 2007-04-04 12:51 am (UTC)
From: [identity profile] catpad.livejournal.com
На самом деле, в этой конкретной программе starvation удаётся избежать за счёт того, что философ "думает" после того, как положил вилки на стол. Что, конечно, не является строгим решением.
Строгое решение предписывает не просто будить своих соседей, а проверять, что каждый из соседей 1) голоден (т.е. не находится в состоянии thinking или eating), и 2) обе вилки голодного соседа свободны. Причём философ не просто будит соседа, отвечающего этим условиям, а ещё и сам выставляет его состояние в "eating". То есть, в этом случае, вместо посылания сообщения WakeUp (которое неизвестно ещё когда придёт), мне нужно было бы просто менять переменную внутри объекта Philosopher, а я хотел этого избежать.
Моё решение можно считать lightweight и не строгим. Хотя статистическая проверка показывает, что все философы едят примерно одинаковое количество раз.

Re: Про философов

Date: 2007-04-03 05:24 pm (UTC)
From: [identity profile] gianthare.livejournal.com
И как тебя только в Блюмберг взяли

Re: Про философов

Date: 2007-04-04 12:31 am (UTC)
From: [identity profile] catpad.livejournal.com
И не говори.

Profile

catpad: (Default)
catpad

October 2022

S M T W T F S
      1
234 5678
9101112131415
16171819202122
23242526272829
3031     

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 18th, 2025 11:27 am
Powered by Dreamwidth Studios