Заметки по использованию
Заметки по использованию таймера
-
Только возврат из обратного вызова
onXXXX
можно добавлять таймеры. Рекомендуется устанавливать глобальные таймеры в обратном вызовеonWorkerStart
, а таймеры для определенного соединения - вonConnect
. -
Добавленные задания по таймеру выполняются в текущем процессе (не запускают новый процесс или поток), что может привести к блокировке процесса, если задача занимает много времени (особенно если она связана с сетевым вводом-выводом). Поэтому лучше запускать длительные задачи в отдельном процессе, например, запуская один или несколько рабочих процессов.
-
Если текущий процесс занят другими делами или если задача не завершена в ожидаемое время, и при этом пришло время следующего запуска, то будет ожидаться завершение текущей задачи, что может привести к тому, что таймер не будет запускаться в соответствии с заданным интервалом. То есть бизнес-логика текущего процесса выполняется последовательно, а для нескольких процессов задачи выполняются параллельно.
-
Следует обратить внимание на возможные проблемы с параллельностью, если множество процессов устанавливают одинаковые таймеры. Например, в следующем коде будет выводиться "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 добавления таймера
-
Может быть погрешность около 1 миллисекунды.
-
Таймер нельзя удалить из другого процесса. Например, таймер, установленный в процессе a, не может быть удален напрямую из процесса b с использованием интерфейса Timer::del.
-
Идентификаторы таймеров могут повторяться между разными процессами, но не будут повторяться внутри одного процесса.
-
Изменение системного времени повлияет на поведение таймера, поэтому после изменения системного времени рекомендуется выполнить restart для перезапуска.