SymfonyWorld Online 2022 Winter Edition

Класс Ev

(PECL ev >= 0.2.0)

Введение

Класс EV является статическим классом, обеспечивая доступ к циклу по умолчанию и некоторым распространённым операциям.

Обзор классов

final class Ev {
/* Константы */
const int FLAG_AUTO = 0;
const int FLAG_NOENV = 16777216;
const int FLAG_FORKCHECK = 33554432;
const int FLAG_NOINOTIFY = 1048576;
const int FLAG_SIGNALFD = 2097152;
const int FLAG_NOSIGMASK = 4194304;
const int RUN_NOWAIT = 1;
const int RUN_ONCE = 2;
const int BREAK_CANCEL = 0;
const int BREAK_ONE = 1;
const int BREAK_ALL = 2;
const int MINPRI = -2;
const int MAXPRI = 2;
const int READ = 1;
const int WRITE = 2;
const int TIMER = 256;
const int PERIODIC = 512;
const int SIGNAL = 1024;
const int CHILD = 2048;
const int STAT = 4096;
const int IDLE = 8192;
const int PREPARE = 16384;
const int CHECK = 32768;
const int EMBED = 65536;
const int CUSTOM = 16777216;
const int ERROR = 2147483648;
const int BACKEND_SELECT = 1;
const int BACKEND_POLL = 2;
const int BACKEND_EPOLL = 4;
const int BACKEND_KQUEUE = 8;
const int BACKEND_DEVPOLL = 16;
const int BACKEND_PORT = 32;
const int BACKEND_ALL = 63;
const int BACKEND_MASK = 65535;
/* Методы */
final public static backend(): int
final public static depth(): int
final public static embeddableBackends(): int
final public static feedSignal( int $signum ): void
final public static feedSignalEvent( int $signum ): void
final public static iteration(): int
final public static now(): float
final public static nowUpdate(): void
final public static recommendedBackends(): int
final public static resume(): void
final public static run( int $flags = ?): void
final public static sleep( float $seconds ): void
final public static stop( int $how = ?): void
final public static supportedBackends(): int
final public static suspend(): void
final public static time(): float
final public static verify(): void
}

Предопределённые константы

Флаги, передаваемые при создании цикла:

Ev::FLAG_AUTO

Задаёт флагам значение по умолчанию

Ev::FLAG_NOENV

Если флаг используется (или программа запускает setuid или setgid), то libev не смотрит на переменную окружения LIBEV_FLAGS. В противном случае (по умолчанию), если найден LIBEV_FLAGS, то он полностью переопределяет флаги. Полезно для тестов производительности и поиска ошибок.

Ev::FLAG_FORKCHECK

Заставляет libev проверять ветвление в каждой итерации, вместо вызова EvLoop::fork() вручную. Это работает путём вызова getpid() на каждой итерации цикла, и, таким образом, это может замедлить работу цикла событий с большим количеством итераций цикла, но обычно не сильно. Этот флаг не может быть переопределён или указан в переменной среды LIBEV_FLAGS.

Ev::FLAG_NOINOTIFY

Если этот флаг указан, то libev не будет пытаться использовать API inotify для своих наблюдателей » ev_stat Флаг может быть полезным для сохранения файловых дескрипторов inotify, в противном случае каждый цикл, использующий наблюдателей ev_stat, будет потреблять один дескриптор inotify.

Ev::FLAG_SIGNALFD

Если флаг указан, то libev будет пытаться использовать API signalfd для своих наблюдателей » ev_signal» ev_child). API передаёт сигналы синхронно, что делает его быстрее и, возможно, позволит получить данные из очереди сигналов, а также позволяет упростить обработку сигналов с помощью потоков, поскольку сигналы корректно блокируются в потоках. Signalfd не используется по умолчанию.

Ev::FLAG_NOSIGMASK

Если указан флаг, то libev будет избегать изменения маски сигнала. В частности, это применяется, чтобы перед получением сигнала убедиться, что он разблокирован.

Такое поведение полезно для обработки пользовательских сигналов или обработки сигналов только определённых потоков.

Флаги, передаваемые в Ev::run(), или EvLoop::run()

Ev::RUN_NOWAIT

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

Ev::RUN_ONCE

Означает, что цикл событий будет искать новые события (ожидая, в случае необходимости) и обрабатывать эти и любые уже ожидающие события из них. Он будет блокировать процесс, пока не поступит по крайней мере одно новое событие (это может быть внутреннее событие libev, поэтому нет никакой гарантии, что будет вызвана заданная callback-функция) и завершится после одной итерации цикла.

Флаги, передаваемые в Ev::stop() , или EvLoop::stop()

Ev::BREAK_CANCEL

Отмена операции прерывания.

Ev::BREAK_ONE

Возвращает самый глубокий запрос Ev::run() (или EvLoop::run() ).

Ev::BREAK_ALL

Завершает все вложенные вызовы Ev::run() (или EvLoop::run() ).

Приоритеты наблюдателей:

Ev::MINPRI

Минимально допустимый приоритет наблюдателя.

Ev::MAXPRI

Максимально допустимый приоритет наблюдателя.

Битовые маски (полученных) событий:

Ev::READ

Дескриптор файла в наблюдателе EvIo доступен для чтения.

Ev::WRITE

Дескриптор файла в наблюдателе EvIo доступен для записи.

Ev::TIMER

EvTimer наблюдает за превышением лимита времени.

Ev::PERIODIC

EvPeriodic наблюдает за превышением лимита времени.

Ev::SIGNAL

Указанный в EvSignal::__construct() сигнал получен.

Ev::CHILD

pid Указанный в EvChild::__construct() получен и статус изменён.

Ev::STAT

Путь, указанный в наблюдателе EvStat поменял свои атрибуты.

Ev::IDLE

Наблюдатель EvIdle работает, когда остальные наблюдатели ничего не делают.

Ev::PREPARE

Все наблюдатели EvPrepare вызваны ровно перед стартом Ev::run() таким образом, наблюдатели EvPrepare являются последними вызванными наблюдателями перед тем, как цикл событий заснёт или опросит новые события.

Ev::CHECK

Все наблюдатели EvCheck помещены в очередь сразу после того, как Ev::run() собрал новые события, но до того, как они вызовут какую-либо callback-функцию для полученных событий. Таким образом, наблюдатели EvCheck будут вызваны раньше, чем любые другие наблюдатели с таким же либо более низким приоритетом в этой итерации цикла событий.

Ev::EMBED

Встроенный цикл событий, заданный в наблюдателе EvEmbed требует к себе внимания.

Ev::CUSTOM

Никогда не посылается (или иным образом используется) библиотекой libev самостоятельно, но может свободно использоваться пользователями libev для сигнализирующих наблюдателей (т.е. с помощью EvWatcher::feed() ).

Ev::ERROR

Произошла неизвестная ошибка и наблюдатель будет остановлен. Может произойти из-за некорректного запуска наблюдателя, потому, что libev исчерпал лимит по памяти, из-за закрытого дескриптора файла или по какой-либо ещё причине. Libev считает, что эти ошибки приложения. Также читайте раздел » АНАТОМИЯ НАБЛЮДАТЕЛЕЙ

Флаги бэкенда:

Ev::BACKEND_SELECT

выбор бэкенда - select(2)

Ev::BACKEND_POLL

опрос бэкенда - poll(2)

Ev::BACKEND_EPOLL

Специфичный для Linux бэкенд epoll(7) для ядер до и после 2.6.9

Ev::BACKEND_KQUEUE

kqueue - бэкенде используемый в большинстве систем BSD. Наблюдатель EvEmbed может быть использован для вставки одного цикла (с бэкендом kqueue) в другой. Например, можно попытаться создать цикл событий с бэкендом kqueue и использовать его только для сокетов.

Ev::BACKEND_DEVPOLL

Бэкенд Solaris 8. Пока не реализован.

Ev::BACKEND_PORT

Механизм порта событий с хорошим масштабированием в Solaris 10.

Ev::BACKEND_ALL

Пробовать все бэкенды (кроме испорченных). Не рекомендуется использовать напрямую. Тут необходимо использовать побитовые операции (т.е. Ev::BACKEND_ALL & ~ Ev::BACKEND_KQUEUE ). Использовать Ev::recommendedBackends() , или не задавать никакого бэкенда вообще.

Ev::BACKEND_MASK

Не бэкенд, но маска для выбора всех бит бэкендов из значения flags, для исключения каких-либо бэкендов. (т.е. когда модифицируете переменную окружения LIBEV_FLAGS).

Замечание:

Для цикла по умолчанию, во время фазы инициализации модуля Ev, регистрируется вызов » ev_loop_fork с помощью pthread_atfork (если таковой имеется).

Замечание:

Есть методы, позволяющие получить доступ к циклу событий по умолчанию в классе Ev (например, Ev::iteration(), Ev::depth() и т.д.). Для пользовательских циклов (созданных с помощью EvLoop::__ construct()) эти значения могут быть доступны через соответствующие свойства и методы класса EvLoop.

Экземпляр цикла событий по умолчанию может быть извлечён с помощью метода EvLoop::defaultLoop().

Содержание

  • Ev::backend — Возвращает целое число, описывающее бэкенд, используемый libev
  • Ev::depth — Получить глубину рекурсии
  • Ev::embeddableBackends — Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы
  • Ev::feedSignal — Передаём событие сигнала в Ev
  • Ev::feedSignalEvent — Послать событие сигнала в цикл по умолчанию
  • Ev::iteration — Получить количество произведённых опросов цикла по умолчанию на предмет новых событий
  • Ev::now — Получить время запуска последней итерации цикла по умолчанию
  • Ev::nowUpdate — Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now
  • Ev::recommendedBackends — Получить битовую маску рекомендованных бэкендов для данной платформы
  • Ev::resume — Возобновить выполнение приостановленного ранее событийного цикла по умолчанию
  • Ev::run — Начать проверку наличия событий и вызов callback-функций цикла по умолчанию
  • Ev::sleep — Блокировать процесс заданное количество секунд
  • Ev::stop — Остановить событийный цикл по умолчанию
  • Ev::supportedBackends — Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev
  • Ev::suspend — Приостановить событийный цикл по умолчанию
  • Ev::time — Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix
  • Ev::verify — Производит внутреннюю проверку целостности(для отладки)
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top