Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Жизненный цикл

FileBroker::new записывает путь, connect открывает файл, каждая подписка открывает читателя, а завершение работы закрывает запись. StdioBroker подключает каналы процесса при первом использовании.

Три состояния файлового брокера как типы и то, что каждый переход делает с файлом потокаБрокерТранспорт: файлFileBroker::new(path)ConnectedFileBrokerClosed = ()сообщать нечегоЗаписывает путьи настройки, без I/OОткрывает файл илисоздаёт его; в пустойпишет служебноеКаждая подписка:консьюмер или читательдля воспроизведенияКаждая публикация:дозапись и сбросЖдёт публикаций,пишет метку конца,если задана, сбрасываети синхронизируетс устройствомИздатель, переживший соединение, отвечает NotConnected,а перемотка через старый дескриптор получает отказ
Схема текстом
  1. Брокер: FileBroker::new (path); ConnectedFileBroker; Closed = () сообщать нечего
  2. Транспорт: файл: Записывает путь и настройки, без I/O; Открывает файл или создаёт его; в пустой пишет служебное; Каждая подписка: консьюмер или читатель для воспроизведения; Каждая публикация: дозапись и сброс; Ждёт публикаций, пишет метку конца, если задана, сбрасывает и синхронизирует с устройством
  3. FileBroker::new (path) → ConnectedFileBroker: connect(self)
  4. ConnectedFileBroker → Closed = () сообщать нечего: shutdown(self)
  5. Записывает путь и настройки, без I/O → Открывает файл или создаёт его; в пустой пишет служебное
  6. Открывает файл или создаёт его; в пустой пишет служебное → Каждая подписка: консьюмер или читатель для воспроизведения
  7. Каждая подписка: консьюмер или читатель для воспроизведения → Каждая публикация: дозапись и сброс
  8. Каждая публикация: дозапись и сброс → Ждёт публикаций, пишет метку конца, если задана, сбрасывает и синхронизирует с устройством
  9. Издатель, переживший соединение, отвечает NotConnected, а перемотка через старый дескриптор получает отказ

new не выполняет ввода-вывода, поэтому билдер сервиса остаётся синхронным. Рантайм подключает брокер при старте приложения. Подключение создаёт файл, если его нет, или возвращает ошибку под existing_only. Оно проверяет интервал маяков, открывает стример клиента и один продюсер, а в файл, в котором пока ничего нет, записывает служебное сообщение.

Каждая подписка открывает читателя на рантайме, на котором выполнился connect: консьюмер на конце файла для живой подписки или читатель всего файла для воспроизведения. Публикация дописывает сообщение и сбрасывает его в файл, как показывает страница Запись.

Завершение работы сначала помечает соединение закрытым, поэтому публикация, начатая после этого, возвращает ошибку. Затем оно ждёт публикаций, которые ещё выполняются, и забирает продюсер. Клиент закрывает запись файла: пишет метку конца потока, если она задана, сбрасывает буфер и синхронизирует файл с устройством. Только после этого крейт удаляет свой продюсер и ещё раз обращается к клиенту. Иначе поздно удалённый дескриптор закрыл бы запись следующего соединения с тем же файлом.

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

Брокер stdio​

Три состояния брокера stdio как типы и то, что каждый переход делает с каналами процессаБрокерТранспорт: каналыStdioBroker::new()ConnectedStdioBrokerClosed = ()сообщать нечегоЗаписывает loopback,каналы не трогаетПервая подписка:поток stdinПервая публикация:поток stdoutЗавершает все потокиstdio процессаИздатель, переживший соединение, отвечает NotConnected
Схема текстом
  1. Брокер: StdioBroker::new(); ConnectedStdioBroker; Closed = () сообщать нечего
  2. Транспорт: каналы: Записывает loopback, каналы не трогает; Первая подписка: поток stdin; Первая публикация: поток stdout; Завершает все потоки stdio процесса
  3. StdioBroker::new() → ConnectedStdioBroker: connect(self)
  4. ConnectedStdioBroker → Closed = () сообщать нечего: shutdown(self)
  5. Записывает loopback, каналы не трогает → Первая подписка: поток stdin
  6. Первая подписка: поток stdin → Первая публикация: поток stdout
  7. Первая публикация: поток stdout → Завершает все потоки stdio процесса
  8. Издатель, переживший соединение, отвечает NotConnected

Подключение записывает, замкнут ли брокер на себя (loopback), и не трогает каналов. Первая подписка в процессе запускает поток stdin клиента, а первая публикация - его поток stdout, как показывает страница Канал. Оба потока обслуживают весь процесс. Поэтому завершение работы закрывает в нём каждый консьюмер и продюсер stdio, включая принадлежащие другим брокерам.