Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 9 из 20III. Управляемая динамика125 минут

Глава 9. Генераторы, Fibers и честная кооперация

Генератор управляет последовательностью значений, Fiber — приостановкой стека; ни один механизм сам по себе не выполняет работу параллельно.

После главы вы сможете
  • строить ленивый pipeline
  • объяснять suspend/resume
  • не блокировать event loop

Ленивый источник событий

Pulse читает одну строку, декодирует и yield возвращает Event. Память зависит от размера текущей строки, batch и агрегата, а не от всего файла. yield from соединяет источники, сохраняя понятную последовательность и передачу исключения.

Генератор одноразовый: после завершения его нельзя обязательно перемотать. Код, которому нужен второй проход, обязан явно материализовать ограниченный набор или запросить фабрику нового iterator.

Пауза не равна потоку

Кооперативное выполнениеПереключение происходит только в явных точках; блокирующая операция останавливает весь процесс.Task Arunsuspendyield controlSchedulerchooseTask BrunresumeA value
Переключение происходит только в явных точках; блокирующая операция останавливает весь процесс.

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 этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Выполняет ли Fiber код параллельно сам по себе?
2. Можно ли всегда пройти Generator второй раз?

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/manual/en/language.fibers.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/manual/en/features.gc.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie