乐趣区

关于swoole:Swoole-定时器能实现毫秒级任务调度你敢相信吗

简介

Timer 毫秒精度的定时器,底层基于 epoll_waitsetitimer 实现,数据结构应用 最小堆 ,可反对增加大量定时器,应用最小堆数据结构实现的定时器,相似 JavaScript 的 setIntervalSwoole 定时器的增加和删除,全副为内存操作,因而性能是十分高的。

Swoole 中的 TimerPHP 自身的 pcntl_alarm 是不同的。pcntl_alarm 是基于 时钟信号 + tick 函数实现,一个是最大仅反对到秒,另一个是不反对同时设定多个定时器程序,性能相对来说会比拟差。

距离时钟定时器

咱们能够通过 Timer::tick 来实现距离时钟定时器,定时器会继续触发,每隔指定工夫主动触发执行回调函数,直到调用 Timer::clear 来革除指定的定时器。

$i = 0;

Swoole\Timer::tick(1000, function($id) use ($i) {

    global $i;

    echo "tick id:$id i:$i \n";

    $i++;

});
  • 每隔 1 秒工夫触发一次回调函数,回调函数会主动打印一行信息到控制台。

一次性定时器

须要执行一次定时器的时候能够应用 Timer::after , 此函数是一个一次性定时器,与距离时钟定时器不同,执行实现后就会销毁,须要留神的是 Timer::after 是非阻塞的。

Swoole\Timer::after(2000, function () {echo "执行一次的 after\n";});
  • 2 秒后执行回调函数,执行实现后主动退出。

革除定时器

Timer::after 执行实现后会主动退出,不须要革除,而 Timer::tick 没有革除定时器操作,会始终执行,直到程序退出。当不须要定时器的时候,咱们能够应用 Timer::clear 来达到进行定时器的目标,将对应定时器 id 传入该办法即可。

​ 留神,Timer::clear 不能用于革除其余过程的定时器,只作用于以后过程。


$i = 0;

Swoole\Timer::tick(1000, function ($id) use ($i) {

    global $i;

    echo "tick id:$id i:$i \n";

    $i++;

    if ($i > 10) {Swoole\Timer::clear($id);

    }

});
  • 每隔 1 秒执行一次回调函数,当 $i 自增到 10 时,敞开定时器,此时程序会主动退出。

革除所有定时器

Timer::clearAll 用来革除同一过程空间中的计时器。基本上与 Timer::clear 雷同,但 Timer::clearAll 能够一次性革除所有流动的计时器。

Swoole\Timer::tick(2000, function () {echo "tick \n";});

$str = "Swoole";

Swoole\Timer::after(1000, function() use ($str) {echo "Hello, $str\n";});

Swoole\Timer::clearAll();

结尾

​ 定时器性能能够很不便的实现定时工作,例如 CRMEB Pro 零碎 中的主动勾销订单、主动确认收货、主动商品高低架、主动到期租户等操作就是基于 Timer::tick 来实现的。

​ CRMEB Pro 零碎 以卓越的零碎性能,共性的后盾操作,丰盛的营销性能,精细化的用户经营,裂变式分销,个性化流传,解决电商引流、推广难题,帮忙企业打造生态级 B2C 盈利模式商城。

开源地址
码云地址:
http://github.crmeb.net/u/defu

Github 地址:
http://github.crmeb.net/u/defu

开源不易,Star 以表尊重,感兴趣的敌人欢送 Star,提交 PR,一起保护开源我的项目,造福更多人!

退出移动版