Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация параллельных вычислений с помощью RMI 
:(
    Опции темы
APM
Дата 19.2.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 13.7.2007

Репутация: нет
Всего: 6



Подскажите где почитать по поводу решения вот такой задачи. Нужно с помощью RMI распараллелить некоторый алгоритм. Почитал про RMI, но не понял несколько вещей:

1) Как сделать так, чтобы в программу можно было передавать количество компьютеров, участвующих в работе. Т.е. допустим передаем параметр 5 и процесс делится на 5 машин, там ведь IP адреса приходится указывать, значит для нового числа машин придется исходный код править?

2) Есть некоторый метод, который выполняется очень долго. Как сделать так, чтобы один компьютер считал часть данных, параллельно ему другой другую часть и т.д. Я как понял когда мы вызываем метод, то нужно ждать результат. А нужно передать всем машинам данные и когда они досчитают принять результат обратно.
PM   Вверх
powerOn
Дата 19.2.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Цитата(APM @  19.2.2008,  20:06 Найти цитируемый пост)
Т.е. допустим передаем параметр 5 и процесс делится на 5 машин, там ведь IP адреса приходится указывать, значит для нового числа машин придется исходный код править?

Напиши некий локатор вичислительных машин, который знает сколько компьютеров подключено к вычислительной системе и может раздавать всем задания. Если захочешь добавть дополнительную машину, то регистрируешь её на локаторе. Локатор сам по себе такой же RMI сервер, как и вычислительные сервера (машины).

Цитата(APM @  19.2.2008,  20:06 Найти цитируемый пост)
Есть некоторый метод, который выполняется очень долго. Как сделать так, чтобы один компьютер считал часть данных, параллельно ему другой другую часть и т.д. Я как понял когда мы вызываем метод, то нужно ждать результат. А нужно передать всем машинам данные и когда они досчитают принять результат обратно. 


Используй либо многозадачность, либо RMI Callback.



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
APM
Дата 19.2.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 13.7.2007

Репутация: нет
Всего: 6



А можно ключевые слова для поиска информации по реализации многозадачности? Или ссылки на документацию. Никогда не приходилось использовать в приложениях многозадачность.
PM   Вверх
powerOn
Дата 19.2.2008, 23:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Возможно ты уже слышал о многопоточности, или о работе с нитями, что впрочем одно и тоже. Это все тоже самое что и многозадачность. По крайней мере я вкладывал именно этот смысл в данное слово.

Официальный туториал
Дополнительный материал: ссылка раз ссылка два





--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
APM
Дата 20.2.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 13.7.2007

Репутация: нет
Всего: 6



Начал читать, но хотелось бы простенький пример, пусть есть вот такой код
Код

public static void main(String[] args)  {
        try {
            Calculator c = (Calculator)Naming.lookup("rmi://localhost/CalculatorService");
            System.out.println(c.sub(4,3));
            System.out.println(c.add(4,5));
            System.out.println(c.mul(3,6));
            System.out.println(c.div(9,3));
        }catch  ....


В данном случае результат c.sub и c.add мы получаем последовательно, причем они запускаются на одном сервере. Допустим, что эти два метода выполняются на разных машинах, пусть машина А должна будет выполнить метод A.add, а машина B - B.add, причем выполнение этих методов должно происходить параллельно, и при получении от обоих машин результата допустим клиент должен их сложить. 

Задача чисто гипотетическая, естественно, практического смысла не имееет, просто хочу понять принцип.


Это сообщение отредактировал(а) powerOn - 20.2.2008, 21:59
PM   Вверх
powerOn
Дата 20.2.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Для такого поведения реализация будет примерно следующей:

Код

Calculator c1 = (Calculator) Naming.lookup("rmi://SOMEHOST_1/CalculatorService");
Calculator c2 = (Calculator) Naming.lookup("rmi://SOMEHOST_2/CalculatorService");

c1.sub(4,3); // данную операцию необходимо сделать ассинхронной 
c2.sub(4,5); // данную операцию необходимо сделать ассинхронной 

// здесь нужно добавить ожидание завершения вычисления.
c1.waitIfNotComplited();
c2.waitIfNotComplited();

// теперь вычисляем итоговый результат.
int result1 = c1.getResult();
int result2 = c2.getResult();
int result = result1 + result2;


Посмотри паттерн Future (на сколько я помню) для создания асинхронных операций. Или просто запускай в отдельном потоке с ожиданием.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
APM
Дата 24.2.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 13.7.2007

Репутация: нет
Всего: 6



Никак не могу понять одной вещи. Как можно узнать, что некоторый метод, запущенный на удаленной машине закончил свою работу?
Пока только на ум приходит следующее: по окончанию своей работы на удаленной машине выставляется некоторый флажок, например dataReady, а на локальной машине через некоторый промежуток времени этот флажок проверяется, т.е. используем sleep(1000). Но такой подход мне что-то не очень нравится.
PM   Вверх
Platon
Дата 24.2.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 3
Всего: 40



powerOn уже все показал!!! Осталось только включить минимум знаний, и простейшая реализация параллельной работы готова.
Код

final Calculator c1 = (Calculator) Naming.lookup("rmi://SOMEHOST_1/CalculatorService");
final Calculator c2 = (Calculator) Naming.lookup("rmi://SOMEHOST_2/CalculatorService");
Thread worker1 = new Thread(new Runnable() {
    public void run() {
        c1.sub(4,3); // данную операцию необходимо сделать ассинхронной 
    }
});
worker1.start();
Thread worker2 = new Thread(new Runnable() {
    public void run() {
        c2.sub(4,5); // данную операцию необходимо сделать ассинхронной 
    }
});
worker2.start();
// здесь нужно добавить ожидание завершения вычисления.
worker1.join();
worker2.join();
// теперь вычисляем итоговый результат.
int result1 = c1.getResult();
int result2 = c2.getResult();
int result = result1 + result2;

PM MAIL ICQ   Вверх
APM
Дата 25.2.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 13.7.2007

Репутация: нет
Всего: 6



Код

for(j=0; j<Num; j++){
                    Thr[j] = new Thread(worker[j]);
                    Thr[j].start();
                }
                for(j=0; j<Num; j++)  {
                    th[j].join();
                }

Допустим Num = 2, тогда идея состоит в том, что на одной машине считаются все данные с четными номерами, а на другой с нечетными, но если смотреть для каких значений было вызвано вычисление, то получаем:
Код

0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
31
33
35

Т.е. для одного из потоков для одних и тех же значений вычисления проходят дважды. Я снова что-то недопонял?
PM   Вверх
powerOn
Дата 25.2.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Мало кода. Совершенно не понятно как этот вывод формируется.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
APM
Дата 26.2.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 13.7.2007

Репутация: нет
Всего: 6



Ладно, с потоками попробую сам разобраться. 

Еще один вопрос. При запуске программы сервера я создаю регистр командой 
Код

LocateRegistry.createRegistry(1099);

Этот регистр должен создаваться на одной машине или на каждой, где запускается программа-сервер?

PM   Вверх
powerOn
Дата 27.2.2008, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



На каждом сервере.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0961 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.