Ленивый источник событий
Pulse читает одну строку, декодирует и yield возвращает Event. Память зависит от размера текущей строки, batch и агрегата, а не от всего файла. yield from соединяет источники, сохраняя понятную последовательность и передачу исключения.
Генератор одноразовый: после завершения его нельзя обязательно перемотать. Код, которому нужен второй проход, обязан явно материализовать ограниченный набор или запросить фабрику нового iterator.
Пауза не равна потоку
send, key и return
Generator способен принимать значение через send и вернуть финальный результат, доступный после завершения. Эти возможности полезны для протоколов, но усложняют чтение. Для обычного EventSource лучше однонаправленный iterable и отдельный объект статистики.
Ключи yield сохраняются. При объединении источников одинаковые ключи могут конфликтовать при материализации, поэтому Pulse либо отдаёт последовательные элементы без значимого ключа, либо использует уникальный EventId.
Что даёт Fiber
Fiber сохраняет стек функции и позволяет suspend из глубины вызовов, а затем resume или throw. Он служит фундаментом async-библиотек, где scheduler связывает неблокирующий ввод-вывод с готовыми задачами. Без scheduler Fiber — ручная машина переключений.
Обычный file_get_contents внутри Fiber остаётся блокирующим. Чтобы получить конкурентность I/O, все операции пути должны сотрудничать с одним event loop. Смешивание блокирующего драйвера и async API разрушает ожидаемую отзывчивость.
Отмена и cleanup
Кооперативная задача получает сигнал отмены в предсказуемых точках, закрывает ресурс в finally и не начинает новую дорогую операцию. Нельзя рассчитывать, что уничтожение Fiber автоматически завершит предметную транзакцию.
Для Pulse сначала достаточно генераторов и синхронного batch. Fiber вводится только при измеренном ожидании нескольких независимых неблокирующих источников и наличии зрелого scheduler.
Лаборатория
Соберите pipeline readLines → decodeEvents → filterCritical → aggregate. Затем нарисуйте, где мог бы suspend неблокирующий источник, и отметьте все блокирующие вызовы, которые нарушили бы кооперацию.
- Pipeline проходит источник один раз.
- Ошибка содержит номер строки.
- Fiber не заявляется как параллельный поток.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/manual/en/language.fibers.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/features.gc.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .