mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-25 12:43:09 +00:00
service.lua可以在用一个服务中复用
This commit is contained in:
@@ -7,10 +7,10 @@ local builder = {}
|
|||||||
|
|
||||||
local cache = {}
|
local cache = {}
|
||||||
local dataset = {}
|
local dataset = {}
|
||||||
|
local address
|
||||||
local function monitor(pointer)
|
local function monitor(pointer)
|
||||||
skynet.fork(function()
|
skynet.fork(function()
|
||||||
skynet.call(service.address, "lua", "collect", pointer)
|
skynet.call(address, "lua", "collect", pointer)
|
||||||
for k,v in pairs(cache) do
|
for k,v in pairs(cache) do
|
||||||
if v == pointer then
|
if v == pointer then
|
||||||
cache[k] = nil
|
cache[k] = nil
|
||||||
@@ -32,7 +32,7 @@ function builder.new(name, v)
|
|||||||
assert(dataset[name] == nil)
|
assert(dataset[name] == nil)
|
||||||
local datastring = dumpsheet(v)
|
local datastring = dumpsheet(v)
|
||||||
local pointer = core.stringpointer(datastring)
|
local pointer = core.stringpointer(datastring)
|
||||||
skynet.call(service.address, "lua", "update", name, pointer)
|
skynet.call(address, "lua", "update", name, pointer)
|
||||||
cache[datastring] = pointer
|
cache[datastring] = pointer
|
||||||
dataset[name] = datastring
|
dataset[name] = datastring
|
||||||
monitor(pointer)
|
monitor(pointer)
|
||||||
@@ -43,10 +43,10 @@ function builder.update(name, v)
|
|||||||
local newversion = dumpsheet(v)
|
local newversion = dumpsheet(v)
|
||||||
local diff = dump.diff(lastversion, newversion)
|
local diff = dump.diff(lastversion, newversion)
|
||||||
local pointer = core.stringpointer(diff)
|
local pointer = core.stringpointer(diff)
|
||||||
skynet.call(service.address, "lua", "update", name, pointer)
|
skynet.call(address, "lua", "update", name, pointer)
|
||||||
cache[diff] = pointer
|
cache[diff] = pointer
|
||||||
local lp = assert(cache[lastversion])
|
local lp = assert(cache[lastversion])
|
||||||
skynet.send(service.address, "lua", "release", lp)
|
skynet.send(address, "lua", "release", lp)
|
||||||
dataset[name] = diff
|
dataset[name] = diff
|
||||||
monitor(pointer)
|
monitor(pointer)
|
||||||
end
|
end
|
||||||
@@ -161,7 +161,7 @@ end)
|
|||||||
end
|
end
|
||||||
|
|
||||||
skynet.init(function()
|
skynet.init(function()
|
||||||
service.new("datasheet", datasheet_service)
|
address=service.new("datasheet", datasheet_service)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
return builder
|
return builder
|
||||||
|
|||||||
@@ -18,19 +18,20 @@ end
|
|||||||
function service.new(name, mainfunc, ...)
|
function service.new(name, mainfunc, ...)
|
||||||
local p = get_provider()
|
local p = get_provider()
|
||||||
local addr, booting = skynet.call(p, "lua", "test", name)
|
local addr, booting = skynet.call(p, "lua", "test", name)
|
||||||
|
local address
|
||||||
if addr then
|
if addr then
|
||||||
service.address = addr
|
address = addr
|
||||||
else
|
else
|
||||||
if booting then
|
if booting then
|
||||||
service.address = skynet.call(p, "lua", "query", name)
|
address = skynet.call(p, "lua", "query", name)
|
||||||
else
|
else
|
||||||
check(mainfunc)
|
check(mainfunc)
|
||||||
local code = string.dump(mainfunc)
|
local code = string.dump(mainfunc)
|
||||||
service.address = skynet.call(p, "lua", "launch", name, code, ...)
|
address = skynet.call(p, "lua", "launch", name, code, ...)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
cache[name] = service.address
|
cache[name] = address
|
||||||
return service.address
|
return address
|
||||||
end
|
end
|
||||||
|
|
||||||
function service.query(name)
|
function service.query(name)
|
||||||
|
|||||||
@@ -1,7 +1,23 @@
|
|||||||
local skynet = require "skynet"
|
local skynet = require "skynet"
|
||||||
local kvdb = require "kvdb"
|
local kvdb = require "kvdb"
|
||||||
|
|
||||||
|
local function dbname(i)
|
||||||
|
return "db"..i
|
||||||
|
end
|
||||||
skynet.start(function()
|
skynet.start(function()
|
||||||
kvdb.set("A", 1)
|
for i=1,10 do
|
||||||
print(kvdb.get "A")
|
kvdb.new(dbname(i))
|
||||||
|
end
|
||||||
|
local idx=1
|
||||||
|
for i=1,10 do
|
||||||
|
local db=dbname(i)
|
||||||
|
kvdb.set(db,"A",idx)
|
||||||
|
idx=idx+1
|
||||||
|
kvdb.set(db,"B",idx)
|
||||||
|
idx=idx+1
|
||||||
|
end
|
||||||
|
for i=1,10 do
|
||||||
|
local db=dbname(i)
|
||||||
|
print(db,kvdb.get(db,"A"),kvdb.get(db,"B"))
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|||||||
@@ -3,13 +3,12 @@ local service = require "skynet.service"
|
|||||||
|
|
||||||
local kvdb = {}
|
local kvdb = {}
|
||||||
|
|
||||||
-- service.address is the default address registered by itself.
|
function kvdb.get(db,key)
|
||||||
function kvdb.get(key)
|
return skynet.call(service.query(db), "lua", "get", key)
|
||||||
return skynet.call(service.address, "lua", "get", key)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function kvdb.set(key, value)
|
function kvdb.set(db,key, value)
|
||||||
skynet.call(service.address, "lua", "set", key , value)
|
skynet.call(service.query(db), "lua", "set", key , value)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- this function will be injected into an unique service, so don't refer any upvalues
|
-- this function will be injected into an unique service, so don't refer any upvalues
|
||||||
@@ -36,8 +35,8 @@ local function service_mainfunc(...)
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
skynet.init(function()
|
function kvdb.new(db)
|
||||||
service.new("kvdb", service_mainfunc, "Service Init")
|
return service.new(db, service_mainfunc, "Service Init")
|
||||||
end)
|
end
|
||||||
|
|
||||||
return kvdb
|
return kvdb
|
||||||
|
|||||||
Reference in New Issue
Block a user