swoole中提供了一个定期器的用法

$server->tick(1000, function() use ($server, $fd) {
$server->send($fd, "hello world");
});

开始的时候我是这么用的,看下代码

<?php

$serv = new Swoole\Server("0.0.0.0", 9501);

$serv->set(array(
'worker_num' => 1, //worker process num
)); $serv->on('connect', function ($serv, $fd){
echo "客户端 ".$fd."连接成功 \n";
});
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
echo "客户端 ".$fd."发来消息:".$data."\n";
$serv->send($fd, 'Swoole已经介绍到您发送的消息: '.$data);
});
$serv->on('close', function ($serv, $fd) {
echo "客户端 {$fd}关闭连接\n";
}); $serv->on('WorkerStart', function ($serv, $worker_id){
$serv->tick(2000, function(){
echo "执行定时器任务 ".time()." \n";
});
}); $serv->start();

开始使用定时器的时候我放到了 onWorkStart 中执行,这样做的话可以保证在单个worker进程的情况下定时器可以正常运行,但是对于swoole来说让它单进程工作显然辱没了它的 "才华" ,于是我将 work_num 设置为2 然后意外就发生啦,如图

我们可以看到有两个定期器在工作一个任务执行了相同的两次,于是这种方法是不对的,当然我们可以在 onWorkStart 中通过判断 worker_id 来避免这种情况,但是后来我发现其实还有另外一种相对来说好点的方法,就是使用 用户自定义进程来做

bool Server->addProcess(Process $process);

代码如下:

<?php

$serv = new Swoole\Server("0.0.0.0", 9501);

$serv->set(array(
'worker_num' => 2, //worker process num
)); //创建自定义进程
$process = new Swoole\Process(function($process) use ($serv) {
$serv->tick(2000, function(){
echo "执行定时器任务 ".time()." \n";
});
}); $serv->addProcess($process); $serv->on('connect', function ($serv, $fd){
echo "客户端 ".$fd."连接成功 \n";
});
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
echo "客户端 ".$fd."发来消息:".$data."\n";
$serv->send($fd, 'Swoole已经介绍到您发送的消息: '.$data);
});
$serv->on('close', function ($serv, $fd) {
echo "客户端 {$fd}关闭连接\n";
}); $serv->start();

执行效果:

ok!完美执行

【swoole】如果使用好定时器功能的更多相关文章

  1. Linux使用一个定时器实现设置任意数量定时器功能【转】

    转自:https://www.jb51.net/article/120748.htm 为什么需要这个功能,因为大多数计算机软件时钟系统通常只能有一个时钟触发一次中断.当运行多个任务时,我们会想要多个定 ...

  2. laravel实现定时器功能

    前记 laravel实现定时器功能有两种方法: 1. 使用 command . 2.   在闭包函数内写实现的方法. 在这里我比较推荐第一种方法,因为第一种方法把具体的实现抽离出来了,看起来简单且富有 ...

  3. JAVA实现定时器功能

    在接口开发时,有一种开发模式叫定时器模式,可以理解为每经过一段预设的时间就会执行一次事件,而在我们的工作中,这个事件所实现的功能一般是将两个系统的数据信息进行同步,这样就实现了两个系统通过接口进行对接 ...

  4. 定时器_在.net core3.0 webapi中添加自定义定时器功能

    前言:想在.net framework环境使用自定义定时器的话,参考我的另一篇文章:https://www.cnblogs.com/lxhbky/p/10242839.html 想在.net core ...

  5. TIM4定时器功能设置

    一.初始化过程 /*********************************************************************** 利用TIM4定时器作为计时,每个0.1 ...

  6. 不用写Windows服务实现定时器功能(FluentScheduler )

    MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...

  7. Android定时器功能实现方法

    在Android开发中,定时器一般有以下3种实现方法: 1.采用Handler与线程的sleep(long)方法 2.采用Handler的postDelayed(Runnable, long)方法 3 ...

  8. Delphi的DLL里如何实现定时器功能?

    一,首先引入“mmsystem”单元. 二,启动定时器: var MMTimerID: Integer; // 定时器ID MMTimerID := timeSetEvent(1000, 0, @Ti ...

  9. MFC的DLL中实现定时器功能

    方法一:创建一个线程, 反复读系统时间不就可以了? 如果定时要求不严,用Sleep就可以了.DWORD WINAPI TimerThread(LPVOID pamaram) { UINT oldTic ...

随机推荐

  1. CSS(选择器)

    CSS(选择器) 作用:用于匹配 HTML 元素 选择器分类: 1.元素选择器  a{} 2.伪元素选择器  ::before{}  (真实存在的元素) 3.类选择器   .link{} 4.属性选择 ...

  2. (一)linux定时任务的设置 crontab 基础实践

    为当前用户创建cron服务 1.  键入 crontab  -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...

  3. [ Java面试题 ]多线程篇

    1.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一 ...

  4. Fedora Linux安装deb包

    前言: 我们知道,在Linux系统上有两种主要的软件包格式,分别是RPM和deb. RPM是"RPM Package Manager(RPM软件包管理器)"的递归缩写.RPM是一种 ...

  5. javascript执行上的一点总结

    今天在为软件工程的的作业准备的时候发现代码执行上的一些问题,暴露了我的一些缺陷,先上代码 <html> <head> <script type="text/ja ...

  6. protocol_v2.go

    {         return protocol.NewFatalClientErr(nil, "E_INVALID",             fmt.Sprintf(&quo ...

  7. SSH(Spring_SpringMVC_Hibernate)

    Users实体类 package com.tao.pojo; public class Users { private int id; private String name; private Str ...

  8. POJ_2653_Pick-up sticks_判断线段相交

    POJ_2653_Pick-up sticks_判断线段相交 Description Stan has n sticks of various length. He throws them one a ...

  9. 【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

    一.简介 Lua是一门非常强大.非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言.但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是 ...

  10. 我的mfc基础知识点

    最近由于作业的缘故,结交了mfc这个新朋友,虽然他对我还很是陌生,相信日久定能生情!现在记录一些学习的笔记,备忘. MFC提供了不同类型的设备描述表的类(绘图类):CDC.CPaintDC.CClie ...