skynet 服务调度

skynet.sleep(time)

让当前任务等待time * 0.01s
 

skynet.fork(func, …)

启动一个新的任务去执行func, 相当于开了一个协程,函数调用完返回线程句柄。
 
每次调用skynet.fork ,都是从协程池中获取未被使用的协程,并把协程放入到fork队列中,等待一个消息的调度,然后会把fork队列中的协程拿出来执行一遍,执行结束后,会把协程重新丢入到协程池中,这样避免重复开启关闭协程的额外开销。
 
skynet.fork 创建的协程是通过lua协程来实现的, 当一个协程占用执行权之后,其他的协程需要等待。

 

local skynet = require "skynet"

function task(name)
        local i = 0
        skynet.error(name, "begin task")
        while ( i < 20000000)
        do
                i = i + 1
        end
        skynet.error(name, "end task", i)
end


skynet.start(function()
        skynet.fork(task, "task1")
        skynet.fork(task, "task2")
end)

结果:
在这里插入图片描述
 

skynet.yield()

让出当前的任务执行流程,使本服务内其他任务有机会执行

local skynet = require "skynet"

function task(name)
        local i = 0
        skynet.error(name, "begin task")
        while(i < 200000000)
        do 
                i = i + 1
                if i % 50000000 == 0 then
                        skynet.yield()
                        skynet.error(name, "task yield")
                end
        end
        skynet.error(name, "end task", i)
end


skynet.start(function()
        skynet.fork(task, "task1")
        skynet.fork(task, "task2")
end)

结果:
在这里插入图片描述

skynet.wait 、skynet.wakeup

同一个服务之间的线程可以通过, skynet.wait 以及 skynet.wakeup 来同步线程

local skynet = require "skynet"
local cos = {}

function task1()
        skynet.error("task1 begin task")
        skynet.error("task1 wait")
        skynet.wait()
        skynet.error("task1 end task")
end
        
function task2()
        skynet.error("task2 being task")
        skynet.error("task2 wakeup task1")
        skynet.wakeup(cos[1])   -- task2去唤醒task1,task1并不是马上被唤醒,而是等待task2运行完
        skynet.error("task2 end task")
 
end

skynet.start(function()
        cos[1] = skynet.fork(task1)
        cos[2] = skynet.fork(task2)
 
end)

运行结果:
在这里插入图片描述

skynet.timeout

设定一个定时触发函数 func ,在 time * 0.01s 后触发。

local skynet = require "skynet"

function task()
        skynet.error("task", coroutine.running())
end     
        
skynet.start(function()
        skynet.error("start", coroutine.running())
        skynet.timeout(500, task)
end)    

运行结果
在这里插入图片描述
其实skynet.start服务启动函数实现中,就已经启动了一个timeout为0s的定时器,来执行通过skynet.start函数传参得到的初始化函数。其目的是为了让skynet工作线程调度一次新服务。

这一次服务调度最重要的意义在于把fork队列中的协程全部执行一遍???这句话怎么理解?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值