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的讨论。

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

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

  • 相关阅读:
    AVA 源码解读-规则逻辑
    gojs 如何实现虚线(蚂蚁线)动画?
    谷歌复制接口json
    vue拼图动画Demo
    如何获取一个类的全名
    `webpack-dev-server --inline --progress --config build/webpack.dev.conf.js(vue报错)
    Jquery通知组件
    字典树 (Trie Tree)
    [CPP] 虚函数与纯虚函数
    格雷码
  • 原文地址:https://www.cnblogs.com/ddcoder/p/14234232.html
Copyright © 2011-2022 走看看