FIFO (именованная труба) - PullRequest
2 голосов
/ 29 мая 2009

Я планирую использовать именованные каналы Unix (mkfifo) для простого многопроцессорного обмена сообщениями. Сообщение будет представлять собой одну строку текста.

Не могли бы вы отговорить меня от этого? Какие препятствия мне следует ожидать?

Я заметил эти ограничения:

  1. Отправитель не может продолжить, пока не получено сообщение.
  2. Приемник блокируется, пока не появятся какие-либо данные. Необходим неблокирующий ввод-вывод когда нам нужно остановить чтение. Например, другой поток может попросить об этом.
  3. Получатель мог получить много сообщений за одно чтение. Это должно быть обработано перед выходом.
  4. Максимальная длина атомарного сообщения ограничена 4096 байтами. Это ограничение PIPE_BUF в Linux (см. Man 7 pipe).

Я буду реализовывать обмен сообщениями в Python. Но препятствия в целом держатся.

Ответы [ 2 ]

5 голосов
/ 29 мая 2009
  1. Недостаток переносимости - в основном это Unix. Розетки более портативны.
  2. Сложнее масштабировать до нескольких систем (другие сокеты +)
  3. С другой стороны, я считаю, что каналы работают быстрее, чем сокеты, для процессов на одном компьютере (меньше накладных расходов на связь).

Что касается ваших ограничений,

  1. Вы можете " выбрать " на каналах, чтобы выполнить неблокирующее чтение.
  2. Обычно я (в perl) распечатываю свои сообщения по каналам, разделенным "\ n", и читаю из них строку, чтобы получить по одному сообщению за раз.
  3. Будьте осторожны с атомной длиной.

Я считаю perlipc хорошим обсуждением различных опций, хотя в нем есть специфичный для Perl код.

3 голосов
/ 29 мая 2009

Блокирование как на стороне отправителя, так и на стороне получателя можно обойти с помощью неблокирующего ввода-вывода.

Дополнительные ограничения FIFO:

  • Только один клиент за раз.
  • После того, как клиент закрывает FIFO, серверу необходимо повторно открыть свою конечную точку.
  • однонаправленная.

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

В качестве дополнительного преимущества, если вы хотите масштабировать его для связи между несколькими компьютерами, это практически не изменится. Например, просто возьмите страницу документации Python для socket и замените socket.AF_INET на socket.AF_UNIX, (HOST, PORT) на filename, и просто работает .

SOCK_STREAM даст вам потоковое поведение; то есть две посылки могут быть объединены в один прием или наоборот. AF_UNIX также поддерживает SOCK_DGRAM: дейтаграммы гарантированно отправляются и читаются как единое целое или вообще не читаются. (Аналогично, AF_INET + SOCK_STREAM = TCP, AF_INET + SOCK_DGRAM = UDP.)

...