Asynchronous 具有异步部件和共享内存的julia服务器
我想创建一个julia“服务器”,它包含一个缓存值,并在请求时提供该值,并在从其他通道收到更新时更新该值 我的计划是: 使用juliazmq(zeromq),它侦听REP(reply)套接字,并将值传递给到达该REP套接字的任何请求。 此外,该程序还有一个SUB(subscribe)套接字,每当套接字接收到任何内容时,该套接字都会更新该值 REP套接字使用ZMQ.recv阻塞。 也许子插座也可以,不确定 但基本上,这两个部分都需要在while循环中独立运行,共享一些内存(变量) 因此,这可能需要使用SharedArrays、产卵过程来完成 但我就是不知道如何在代码中做到这一点。 例如,我可以@spawn每个这样的进程,一个有代表,一个有子套接字,但我不知道如何获得他们的pid来创建SharedArray 有人能帮忙吗 我也愿意采用不同的设计解决方案来解决这个问题(基本上,数据是从某些来源不断更新的,而其他程序需要能够获得这些数据的最新副本) 谢谢 伊姆兰 编辑: 我得到了一个简单的版本,如下所示: 它有2个独立的REP/REQ套接字 奇怪的是,这有时会起作用,有时在readcache或writecache中调用readcache()和writecache(41)块之后。。。但我无法复制,因为它有时工作得很顺利 这是朱莉娅解决这个问题的正确方法吗Asynchronous 具有异步部件和共享内存的julia服务器,asynchronous,server,zeromq,julia,mq,Asynchronous,Server,Zeromq,Julia,Mq,我想创建一个julia“服务器”,它包含一个缓存值,并在请求时提供该值,并在从其他通道收到更新时更新该值 我的计划是: 使用juliazmq(zeromq),它侦听REP(reply)套接字,并将值传递给到达该REP套接字的任何请求。 此外,该程序还有一个SUB(subscribe)套接字,每当套接字接收到任何内容时,该套接字都会更新该值 REP套接字使用ZMQ.recv阻塞。 也许子插座也可以,不确定 但基本上,这两个部分都需要在while循环中独立运行,共享一些内存(变量) 因此,这可能需要
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
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
虽然我不知道这是否是解决这个问题的最好方法,但下面的方法似乎有效
虽然我不知道这是否是解决这个问题的最好方法,但下面的方法似乎有效