Я понимаю, что это не идеальный вопрос, но я сделаю все возможное, чтобы объяснить это 🙂
Во-первых, сценарий состоит в том, что мне было поручено создать симулятор здания с несколькими лифтами.
Давайте предположим, что мое здание состоит из 2–5 лифтов и произвольного числа этажей. Цель здесь состояла в том, чтобы позволить «Людям» подняться на лифты и путешествовать на разные этажи.
Ключевым моментом здесь является управление каждым из лифтов одновременно.
Мне удалось сделать это в C ++ с потоком для каждого лифта. То, что я изо всех сил пытаюсь сделать, — это придумать простой способ сделать это с помощью Message Passing в Erlang. Я не прошу кодовый ответ, но, кроме того, объяснение того, как я мог бы решить эту проблему с помощью передачи сообщений. Я, конечно, пытался прочитать информацию по теме, но меня это смущает.
До сих пор я понимаю, что потоки должны общаться через передачу сообщений друг другу. Любая помощь, разъясняющая подход к этому, очень ценится. Это не оцененная домашняя работа или что-то еще, и упражнение для моих знаний.
Последний вопрос:
Как я могу смоделировать здание с несколькими лифтами, запрограммированными для самостоятельной работы, с использованием передачи сообщений (на Erlang).
Вместо того, чтобы поддерживать общее состояние, вы присваиваете каждому процессу свое собственное состояние, и если что-то меняется, вы отправляете сообщения с обновлением (и связанными данными) всем соответствующим процессам.
То, что Дэниел называет процессом, является процессом Эрланга, а не потоком. Они могут выглядеть как потоки, но они, по крайней мере, настолько же различны, насколько они похожи … Так что действительно лучше называть их процессами.
Вы должны быть осторожны, чтобы не брать с собой настрой C, когда вы приходите к разработке решений Erlang. Суть Erlang в том, что это другая парадигма, и хотя сам Erlang реализован на C, и, таким образом, все, что вы делаете в Erlang, в конечном итоге выполняется в потоке C, важно забыть об этом и работать вместо этого с парадигмой Erlang.
В C есть что-то, чем можно управлять, они хитрые и кусают вас, когда вы за ними не следите. Процессы Эрланга замечательны, вы можете, по сути, порождать их неограниченное количество, и они не требуют особого ухода.
В вашем сценарии лифта, как сказал Дэниел, порождение процесса для каждого лифта — разумный план. Одна из вещей, которые следует учитывать при работе с Erlang, заключается в том, что в таких случаях нумераторы не имеют большого значения: как только вы напишите модуль для моделирования своего подъема, вы можете создать от 2 до 5 из них или от 2 до 5 миллионов, и обычно с Эрлангом обнаруживают, что это мало что меняет.
Я не говорю, что вы не можете разработать сломанную реализацию, но, честно говоря, как только вы привыкнете к Erlang, вы обнаружите, что он действительно пригоден для быстрой разработки без обычных ошибок параллелизма и параллелизма.
По мере продвижения вашего сценария подъема, правильный способ продвинуть его вперед — это узнать OTP, использовать что-то вроде gen_server для своих подъемов и супервизора, чтобы порождать их динанмически (или нет) из него. Если ваш лифт падает, процесс будет автоматически заменен / перезапущен. Это аналогично поломке лифта (процесс остановлен, лифт недоступен) и инженеру по ремонту, пришедшему и исправляющему его (процесс перезапущен; лифт снова доступен). То, что происходит с любыми людьми в лифте, когда он ломается, возможно, является более сложной темой, для которой есть несколько возможных решений.
Других решений пока нет …