首页 > 其他分享 >初试定时器

初试定时器

时间:2022-12-08 15:33:10浏览次数:55  
标签:初试 定时器 co -- queue session skynet

新入门skynet系列视频b站网址 https://www.bilibili.com/video/BV19d4y1678X

skynet里面提供了定时器。

skynet.timeout 实际上是请求定时器线程 往自己的队列添加一个消息。首先会向系统注册一个定时器,然后获取一个协程。当定时器触发时,通过定时器的session找到对应的协程,并执行这个协程。

function skynet.timeout(ti, func)
	local session = c.intcommand("TIMEOUT",ti) --seesion是通过当前服务分配的
	assert(session)
	local co = co_create_for_timeout(func, ti) -- 获取一个协程 注意设置了任务函数
	assert(session_id_coroutine[session] == nil)
	session_id_coroutine[session] = co --建立session 和 协程的 对应关系
	return co	-- for debug
end

上面行2 转到下面的c代码

static const char *
cmd_timeout(struct skynet_context * context, const char * param) {
	char * session_ptr = NULL;
	int ti = strtol(param, &session_ptr, 10);
	int session = skynet_context_newsession(context);//获取一个服务内唯一的 session
	skynet_timeout(context->handle, ti, session);//去注册一个定时器 
	sprintf(context->result, "%d", session);
	return context->result;
}

当定时器触发时,会向当前服务所在的队列push一个响应消息。我们看处理这个消息的过程。当然lua层的处理函数入口是 skynet.dispatch_message

function skynet.dispatch_message(...)
	local succ, err = pcall(raw_dispatch_message,...)-- next
	while true do
		if fork_queue.h > fork_queue.t then
			-- queue is empty
			fork_queue.h = 1  --head
			fork_queue.t = 0  --tail
			break
		end
		-- pop queue
		local h = fork_queue.h
		local co = fork_queue[h]
		fork_queue[h] = nil
		fork_queue.h = h + 1

		local fork_succ, fork_err = pcall(suspend,co,coroutine_resume(co))
		
	end
	assert(succ, tostring(err))
end

我们看 第2行代码的 raw_dispatch_message函数

local function raw_dispatch_message(prototype, msg, sz, session, source)
	-- skynet.PTYPE_RESPONSE = 1, read skynet.h
	if prototype == 1 then --这里是处理响应
		local co = session_id_coroutine[session] --响应消息的处理都是 通过seesion去得到协程 然后执行协程;因为session是本服务分配的 所以具有唯一性
        session_id_coroutine[session] = nil
        suspend(co, coroutine_resume(co, true, msg, sz, session))
		
	else --这里主要是处理lua text socket 等消息类型
		--略
	end
end

通过第4行我们找到协程。第6行唤醒协程开始执行 任务函数。

关于定时器的内部实现详细分析,会在 定时器底层实现 里面讲到

标签:初试,定时器,co,--,queue,session,skynet
From: https://www.cnblogs.com/waittingforyou/p/16966224.html

相关文章

  • Jmeter小技能【BeanShell断言、多个相同参数提取、固定定时器、输出执行报告】
    1、BeanShell断言比响应断言更灵活,可通过BeanShell脚本设置Faillure及FailureMessage来执行断言检查,并输出断言失败接口的响应错误内容。//获取响应结果内容Stringre......
  • web API-day01-定时器(间歇函数)
    目标:能够使用定时器函数重复执行代码1.开启定时器语法:setInterval(函数,间隔时间)举例说明:functionrepeat(){console.log(`前端程序员,就是头发多......
  • Unity中实现Timer定时器
    前言:好久没写博客了,倒不是没写的了,现在手里堆着的demo和小功能很多,而是懒,我是真滴懒啊。需求:1.延迟执行方法;2.循环执行,间隔可控制;3.可以改变更新模式(update、fixedupdate,l......
  • python之gRPC初试
    目录前言准备安装示例编写proto文件通过proto文件生成_pb2.py和_pb2_grpc.py文件编写server文件编写client文件运行结语前言本文章作为初学gRPC的一个记录,主要参考文档:Qu......
  • ElementUI Button定时器
    今天遇到的问题是在做王老师的作业项目中遇到的,就是我要通过邮箱登录,我把这一部分的功能完善了,但是我发现有一个问题,就是可以一直发,这个显然是不行的,因为不加以限制用户可......
  • 定时器:ScheduledExecutorService
    方式二:ScheduledExecutorServiceScheduledExecutorService定时器ScheduledExecutorService是jdk1.5中引入了并发包,目的是为了弥补Timer的缺陷,ScheduledExecutorServic......
  • 定时器:Timer
    定时器定时器是一种控制任务延时调用,或者周期调用的技术。作用:闹钟、定时邮件发送。定时器的实现方式方式一:TimerTimer定时器Timer定时器的特点和存在的问题1、Timer是......
  • 0108-Go-定时器
    环境Time2022-08-24Go1.19前言说明参考:https://gobyexample.com/tickers目标使用Go语言的定时器。示例packagemainimport("fmt""time")fu......
  • STM32CubeMX之定时器PWM输出
    STM32CubeMX之定时器PWM输出1.知识百科--PWM简介    ​    PWM是一种对模拟信号电平进行​​​​数字编码​​​​​的方法。通过高​​​​分辨率​​​​计......
  • stm32f030f4p6_定时器1应用
    坑人的PDF框图显示TIM1,2,3,6,14,15,16,17都在APB1上,然而它却在APB2才可以运行。可是在PDF框图和STM32CubeMX中都找不到APB2的存在却在stm32f0xx_rcc.h中找到了APB2的踪......