service.lua可以在用一个服务中复用

This commit is contained in:
hongl
2017-06-14 10:27:04 +08:00
parent 52026eb8f2
commit 5479848df6
4 changed files with 37 additions and 21 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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