zoukankan      html  css  js  c++  java
  • Swoole从入门到入土(21)——毫秒定时器

    Swoole提供了毫秒精度的定时器,所有操作都是内存操作,无额外的IO开销。

    下面让我们一起详细了解每个函数的作用:

    1) 函数tick:设置一个间隔时钟定时器,这个定时器会持续触发

    SwooleTimer::tick(int $msec, callable $callback_function, ...$params): int

    $mesc:指定时间,单位毫秒【如 1000 表示 1 秒,v4.2.10 以下版本最大不得超过 86400000】

    $callback_function:时间到期后所执行的函数,必须是可以调用的,格式为:callbackFunction(int $timer_id, ...$params),可以使用匿名函数的 use 语法传递参数到回调函数中。

    $params:给执行函数传递数据【此参数也为可选参数】

    返回值:定时器的ID

    示例:

    SwooleTimer::tick(3000, function (int $timer_id, $param1, $param2) {
        echo "timer_id #$timer_id, after 3000ms.
    ";
        echo "param1 is $param1, param2 is $param2.
    ";
    
        SwooleTimer::tick(14000, function ($timer_id) {
            echo "timer_id #$timer_id, after 14000ms.
    ";
        });
    }, "A", "B");

    注意事项:

    定时器的校正:定时器回调函数的执行时间不影响下一次定时器执行的时间。实例:在 0.002s 设置了 10ms 的 tick 定时器,第一次会在 0.012s 执行回调函数,如果回调函数执行了 5ms,下一次定时器仍然会在 0.022s 时触发,而不是 0.027s。但如果定时器回调函数的执行时间过长,甚至覆盖了下一次定时器执行的时间。底层会进行时间校正,丢弃已过期的行为,在下一时间回调。如上面例子中 0.012s 时的回调函数执行了 15ms,本该在 0.022s 产生一次定时回调。实际上本次定时器在 0.027s 才返回,这时定时早已过期。底层会在 0.032s 时再次触发定时器回调。

    协程模式:在协程环境下 Timer::tick 回调中会自动创建一个协程,可以直接使用协程相关 API。

    2) 函数after():在指定的时间后执行函数。SwooleTimer::after 函数是一个一次性定时器,执行完成后就会销毁。此函数与 PHP 标准库提供的 sleep 函数不同,after 是非阻塞的。

    SwooleTimer::after(int $msec, callable $callback_function, ...$params): int

    $mesc:指定时间,单位毫秒【如 1000 表示 1 秒,v4.2.10 以下版本最大不得超过 86400000】

    $callback_function:时间到期后所执行的函数,必须是可以调用的,格式为:callbackFunction(int $timer_id, ...$params),可以使用匿名函数的 use 语法传递参数到回调函数中。

    $params:给执行函数传递数据【此参数也为可选参数】

    返回值:定时器的ID

    示例:

    $timer_id=SwooleTimer::tick(1000, function () {
        echo "after 1000ms.
    ";
    });
    SwooleTimer::after(10000,function() use ($timer_id){
        echo "clear:
    ";
        SwooleTimer::clear($timer_id);
    });

    3) 函数clear():使用定时器 ID 来删除定时器。

    SwooleTimer::clear(int $timer_id): bool

    $timer_id:定时器 ID【调用 Timer::tick、Timer::after 后会返回一个整数的 ID】

    注意:SwooleTimer::clear 不能用于清除其他进程的定时器,只作用于当前进程

    4) clearAll():清除当前 Worker 进程内的所有定时器。

    SwooleTimer::clearAll(): bool

    5) info():返回 timer 的信息。

    SwooleTimer::info(int $timer_id): array

    返回值示例:

    array(4) {
      ["exec_msec"]=>
      int(1000)
      ["interval"]=>
      int(0)
      ["round"]=>
      int(0)
      ["removed"]=>
      bool(false)
    }

    6) 函数list():返回定时器迭代器,可使用 foreach 遍历当前 Worker 进程内所有 timer 的 id

    SwooleTimer::list(): SwooleTimerIterator

    示例:

    foreach (SwooleTimer::list() as $timer_id) {
        var_dump(SwooleTimer::info($timer_id));
    }

    7) 函数stat():查看定时器状态。

    SwooleTimer::stats(): array

    返回值示例:

    array(3) {
      ["initialized"]=>
      bool(true)
      ["num"]=>
      int(1000)
      ["round"]=>
      int(1)
    }

    8) 函数set():设置定时器相关参数。

    SwooleTimer::set(array $array): void

    例如:默认定时器在执行回调函数时会自动创建协程,可单独设置定时器关闭协程。

    SwooleTimer::set([
      'enable_coroutine' => false,
    ]);

    Swoole毫秒定时器的内容相对比较简单,这一节到此就要结束了。请关注后续的多进程与协程核心API的讨论。

    ---------------------------  我是可爱的分割线  ----------------------------

    最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

  • 相关阅读:
    el-select下拉框选项太多导致卡顿,使用下拉框分页来解决
    vue+elementui前端添加数字千位分割
    Failed to check/redeclare auto-delete queue(s)
    周末啦,做几道面试题放松放松吧!
    idea快捷键
    解决flink运行过程中报错Could not allocate enough slots within timeout of 300000 ms to run the job. Please make sure that the cluster has enough resources.
    用.net平台实现websocket server
    MQTT实战3
    Oracle 查看当前用户下库里所有的表、存储过程、触发器、视图
    idea从svn拉取项目不识别svn
  • 原文地址:https://www.cnblogs.com/ddcoder/p/14234232.html
Copyright © 2011-2022 走看看