Заметки по использованию

Заметки по использованию таймера

  1. Только возврат из обратного вызова onXXXX можно добавлять таймеры. Рекомендуется устанавливать глобальные таймеры в обратном вызове onWorkerStart, а таймеры для определенного соединения - в onConnect.

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

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

  4. Следует обратить внимание на возможные проблемы с параллельностью, если множество процессов устанавливают одинаковые таймеры. Например, в следующем коде будет выводиться "hi" 5 раз каждую секунду.

    $worker = new Worker();
    // 5 процессов
    $worker->count = 5;
    $worker->onWorkerStart = function(Worker $worker) {
    // 5 процессов, каждый процесс имеет такой же таймер
    Timer::add(1, function(){
        echo "hi\r\n";
    });
    };
    Worker::runAll();

    Если вы хотите, чтобы таймер запускался только в одном процессе, обратитесь к Примеру 2 добавления таймера

  5. Может быть погрешность около 1 миллисекунды.

  6. Таймер нельзя удалить из другого процесса. Например, таймер, установленный в процессе a, не может быть удален напрямую из процесса b с использованием интерфейса Timer::del.

  7. Идентификаторы таймеров могут повторяться между разными процессами, но не будут повторяться внутри одного процесса.

  8. Изменение системного времени повлияет на поведение таймера, поэтому после изменения системного времени рекомендуется выполнить restart для перезапуска.