Порт — это программа, которая взаимодействует со стороной Erlang, используя стандартный ввод-вывод. Нужна ли вам безопасность потоков или нет, зависит от протокола связи, который вы реализуете.
Если вы думаете о том, что порт является процессом erlang (что для стороны erlang является абстракцией, которую видит ваш код erlang), вы можете реализовать протокол, будет ли он блокироваться для каждого запроса, который вы ему отправляете, до тех пор, пока не отправит ответ, или что вы можете отправить несколько запросов параллельно и получить ответы на все из них асинхронно.
Переходя на сторону C, реализация первого случая будет простым циклом, выполняющим
- прочитать команду из стандартного ввода
- обработать эту команду
- записать результат в стандартный вывод
- go to 1
Параллелизм обрабатывается на стороне erlang, так как все входящие команды будут накапливаться в папке «Входящие» порта, пока порт обрабатывает одну за другой.
Для последнего вам понадобится механизм для асинхронной обработки входных сообщений git remote add origin [email protected]:samuelrivas/dfberl.git, здесь для простоты я буду использовать потоки:
Основной цикл:
- прочитать команду из стандартного ввода
- создать поток для его обработки
- go to 1
Петля нити:
- команда процесса
- записать результат в стандартный вывод
Обратите внимание, что потокам потребуется какая-то блокировка при записи в стандартный вывод, я обычно реализую эту часть как еще один поток с асинхронной очередью, в которую все остальные потоки публикуют результаты.
Во втором сценарии у вас будет параллелизм на стороне C, поэтому вам нужно позаботиться о безопасности потоков. В первом случае сторона C не обрабатывает параллелизм, поэтому безопасность потоков здесь не вызывает беспокойства.
person
Samuel Rivas
schedule
11.07.2015