delphi如何获得select得到的信息_92、Workerman通信框架-网络IO库-Select类介绍

该类基于socket的select io复用,对Workerman框架接口EventInterface的实现。而select之前也有讲解过,之不过那时只提到select复用readio。

那么通过workerman框架,我们要学会其是如何完成定时任务

1、Select

1.1、类设计

  • 类概要图
5f8ae0422fbf4de30af9d5da6228492d.png

1.2、源码

  • 实例化Select类对象时,在其构造方法中,设置channel管道,并实例化SplPriorityQueue对象,赋值给_scheduler
  • 新event对象时,调用add方法,其内部实现逻辑,判断对象类型

为EV_EXCEPT时,封装信息,并分别往_allEvents和_exceptFds等数组添加信息

为EV_SIGNAL时,封装信息,往_signalEvents数组添加,然后调用pcntl_signal安装信号

为EV_TIMER或EV_TIMER_ONCE时,封装信息,往_scheduler插入定时任务信息,并往数组添_eventTimer加,然后经判断,赋值给_selectTimeout属性

为EV_READ时,根据_readFds,获取数组的个数,如超过1024,则打印警告信息。然后往_allEvents数组加入信息,再往_readFds数组加入信息

为EV_WRITE时,根据_writeFds,获取数组的个数,如超过1024,则打印警告信息。然后往_allEvents数组加入信息,再往_writeFds数组加入信息

  • 没有当删除event对象时,调用del方法,其内部实现逻辑,如下

为EV_EXCEPT时,则在_allEvents和_exceptFds等数组进行查找,并删除

为EV_READ时,则在_allEvents和_readFds等数组进行查找,并删除

为EV_WRITE时,则在_allEvents和_writeFds等数组进行查找,并删除

为EV_TIMER或EV_TIMER_ONCE时,则在_eventTimer数组进行查找,并删除

为EV_SIGNAL时,则在_signalEvents数组进行查找,并删除,然后去掉信号安装

  • loop

死循环检测

调用pcntl_signal_dispatch,进行子进程的信号分发

等待stream_select函数的返回

判断定时任务数组_scheduler是否为空,如不为空则调用tick方法,进行定时任务处理

从stream_select得到的结果,进行判断和遍历

  • destroy

空实现

  • getTimerCount

返回定时器的任务个数

  • signalHandler

信号回调方法

  • clearAllTimer

清空数组_eventTimer,并重置_scheduler对象

  • tick

定时任务数组_scheduler是否为空,不为空则进行调用_scheduler的top方法,获得第一个任务信息

并把定时任务要执行的时间与当前时间进行操作,并赋值给_selectTimeout

对_selectTimeout进行判断,如满足则执行该定时任务

1.3、总结

通过阅读Select类源码,select函数

stream_select($read, $write, $except, $tv_sec, $tv_usec);

在网络io的复用场景,可以通过select的前三个参数$read, $write, $except进行获取

  • 而$tv_sec, $tv_usec这两个参数的存在意义是什么

答: 这两个参数都是时间单位的参数,其中$tv_sec为秒,而$tv_usec为微秒。但在调用stream_select方法时,两者都为0,则不阻塞,立即返回。相反如存在任意一个,则进行阻塞对应的时间,才返回。因此,在workerman框架,就是利用了个阻塞的时间,配合SplPriorityQueue,进行定时任务。这也是在调用add方法或tick方法时,需要操作属性_selectTimeout的原因

  • 如何实现信号通信?

答,在loop方法中,调用pcntl_signal_dispatch进行信号分发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值