具有异步部分和共享内存的julia服务器

时间:2016-03-07 10:57:28

标签: asynchronous server zeromq julia mq

我想创建一个包含缓存值的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

1 个答案:

答案 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