我想创建一个包含缓存值的julia“服务器”,并在请求时提供该服务器,并在更新从其他渠道到达时更新该值
我的计划是: 使用julia ZMQ(zeromq)监听REP(回复)套接字并将值传递给任何进入该REP套接字的请求。 此外,该程序有一个SUB(订阅)套接字,每当套接字收到任何内容时都会更新值
使用ZMQ.recv的REP套接字块。 也许SUB套接字也可以,不确定
但基本上,两个部分都需要在while循环中独立运行,共享一些内存(变量)
所以也许这需要使用SharedArrays,产生进程
来完成但我无法弄清楚如何在代码中执行此操作。 例如。我可以@spawn每个这样的进程,一个有一个REP,一个有一个SUB套接字,但我不知道如何让他们的pid创建一个SharedArray
有人可以帮忙吗?
我也愿意接受不同的设计解决方案来解决问题(基本上数据是从某些来源不断更新的,其他程序需要能够获得这些数据的最新副本)
由于 姆兰
修改: 我有一个简单的版本工作如下: 它有2个独立的REP / REQ插座 奇怪的是,这有时可以工作,有时在readcache或writecache中调用readcache()和writecache(41)之后会有一些块...但我无法重现,因为它有时只能正常工作
这是在朱莉娅解决这个问题的正确方法吗?
using ZMQ
type CT
a::Int
b::String
end
ct = CT(1,"a")
readport = 5551
readproc = @spawn readcacheproc(ct,readport)
writeport = 5552
writeproc = @spawn writecacheproc(ct,writeport)
# test as follows
# readcache() # expect [1 a]
# writecache("test") # expect [4 test]
# readcache() # expect [4 test]
function readcache(port=readport)
ctx=Context()
s=Socket(ctx,REQ)
ZMQ.connect(s,"tcp://localhost:$port")
ZMQ.send(s,"")
println(bytestring(ZMQ.recv(s)))
ZMQ.close(s)
ZMQ.close(ctx)
end
function writecache(value,port=writeport)
ctx=Context()
s=Socket(ctx,REQ)
ZMQ.connect(s,"tcp://localhost:$port")
ZMQ.send(s,"$value")
println(bytestring(ZMQ.recv(s)))
ZMQ.close(s)
ZMQ.close(ctx)
end
function readcacheproc(cache,port=readport)
ctx=Context()
s=Socket(ctx,REP)
ZMQ.bind(s,"tcp://*:$port")
done = false
while !done
msg = bytestring(ZMQ.recv(s)) # actual msg is ignored
ZMQ.send(s,"$(cache.a) $(cache.b)")
end
ZMQ.close(s)
ZMQ.close(ctx)
end
function writecacheproc(cache,port=writeport)
ctx=Context()
s=Socket(ctx,REP)
ZMQ.bind(s,"tcp://*:$port")
done = false
while !done
msg = bytestring(ZMQ.recv(s))
cache.a = length(msg)
cache.b = msg
ZMQ.send(s,"new cache: $(cache.a) $(cache.b)")
end
ZMQ.close(s)
ZMQ.close(ctx)
end
答案 0 :(得分:0)
以下似乎有效,但我不知道这是否是解决问题的最佳方式
using ZMQ
type CT
a::Int
b::String
end
ct = CT(1,"a")
readport = 5551
readproc = @spawn readcacheproc(ct,readport)
writeport = 5552
writeproc = @spawn writecacheproc(ct,writeport)
# test as follows
# readcache() # expect [1 a]
# writecache("test") # expect [4 test]
# readcache() # expect [4 test]
function readcache(port=readport)
ctx=Context()
s=Socket(ctx,REQ)
ZMQ.connect(s,"tcp://localhost:$port")
ZMQ.send(s,"")
println(bytestring(ZMQ.recv(s)))
ZMQ.close(s)
ZMQ.close(ctx)
end
function writecache(value,port=writeport)
ctx=Context()
s=Socket(ctx,REQ)
ZMQ.connect(s,"tcp://localhost:$port")
ZMQ.send(s,"$value")
println(bytestring(ZMQ.recv(s)))
ZMQ.close(s)
ZMQ.close(ctx)
end
function readcacheproc(cache,port=readport)
ctx=Context()
s=Socket(ctx,REP)
ZMQ.bind(s,"tcp://*:$port")
done = false
while !done
msg = bytestring(ZMQ.recv(s)) # actual msg is ignored
ZMQ.send(s,"$(cache.a) $(cache.b)")
end
ZMQ.close(s)
ZMQ.close(ctx)
end
function writecacheproc(cache,port=writeport)
ctx=Context()
s=Socket(ctx,REP)
ZMQ.bind(s,"tcp://*:$port")
done = false
while !done
msg = bytestring(ZMQ.recv(s))
cache.a = length(msg)
cache.b = msg
ZMQ.send(s,"new cache: $(cache.a) $(cache.b)")
end
ZMQ.close(s)
ZMQ.close(ctx)
end