LINUX.ORG.RU

Erlang - как общаться с процессами?


0

0

Пишу распределенную систему. Сервер и клиенты. Сервер раздает задания - клиенты выполняют и шлют ответ. Пока клиент выполняет вычисления, сервер может посылать сообщения т.е. клиент должен во время вычисления принимать сообщения. Как это реализовать? Примеры из документации с пинг-понгом и мессенджером не помогают, там ведь процессы занимаются только отсылкой-приемом сообщений, а не вычислениями.

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

anonymous
()
Ответ на: комментарий от anonymous

> сдержанно, не давить на них, дабы они не осерчали,

Фигня, давить можно и нужно. Хороший процесс не осерчает, а плохих на не нужно.

anonymous
()

Больше процессов хороших и разных!!! благо в ерланге они дешевы. И обмен сообщениями в пределах одной ноды тоже очень дешев. Сделай три уровня. "сервер" расылающий здания множеству "клиентов", каждый "клиент" при получении задания стартует новый процесс "вычичлитель", который проводит непосредственные вычисления и отсылает сообщение с результатом "клиенту". Т.е. 1 сервер, много клиентов и у каждого клиента много вычслителей. Количество вычислителей можно ограничивать например не более N вычислителей на каждого клиента. Если этот лимит исчерпан, то клиент либо ставит задание в свою очередь, либо отсылает его обратно серверу - пусть ищет нового клиента.

Vinick ★★
()
Ответ на: комментарий от Vinick

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

anonymous
()
Ответ на: комментарий от anonymous

Я сам к ерлангу только присматриваюсь, поэтому не претендую на истину. Но как тебе такой вариант: Список эталонных хешей хранится только на сервере. Клиент делает только две вещи - генерирует очередную строку, считает для нее хеш и отсылает пару {строка,хеш} на сервер. Сервер ищет хэш, полученный от клиента, в эталонном списке. Если нашел выводит результат, если нет ждет дальше. Эталонный список для простоты можно вообще нет изменять, да будет некоторый оверхэд на сервере при поиске. Клиент при окончании перебора просто завершается. Сервер отлавливает это событие и запускает новый процесс клиента с новым диапазоном перебора. Серверов можно сделать несколько отдав каждому часть эталонного списка и ввести над ними суперсервер. И в итоге мы получаем трехуровневую модель, аналогичную предыдущей. :)

Т.е. Есть суперсервер получающий при старте эталонный список хешей длины N. Он запускает N серверов и отдает каждому 1 хеш. Сервер запускает какое-то количество клиентов, каждый из которых будет перебирать строки из заданного дапазона.

Vinick ★★
()
Ответ на: комментарий от Vinick

Или еще лучше. Суперсервер запускает N серверов отдавая каждому по одному хешу, после чего суперсервер запускает M клиентов, передавая каждому клиенту список проверяющих серверов. Когда клиент завершает перебор, суперсервер запускает следующего.

Vinick ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.