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队列中的协程全部执行一遍???这句话怎么理解?