Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 具有异步部件和共享内存的julia服务器_Asynchronous_Server_Zeromq_Julia_Mq - Fatal编程技术网

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

Asynchronous 具有异步部件和共享内存的julia服务器,asynchronous,server,zeromq,julia,mq,Asynchronous,Server,Zeromq,Julia,Mq,我想创建一个julia“服务器”,它包含一个缓存值,并在请求时提供该值,并在从其他通道收到更新时更新该值 我的计划是: 使用juliazmq(zeromq),它侦听REP(reply)套接字,并将值传递给到达该REP套接字的任何请求。 此外,该程序还有一个SUB(subscribe)套接字,每当套接字接收到任何内容时,该套接字都会更新该值 REP套接字使用ZMQ.recv阻塞。 也许子插座也可以,不确定 但基本上,这两个部分都需要在while循环中独立运行,共享一些内存(变量) 因此,这可能需要

我想创建一个julia“服务器”,它包含一个缓存值,并在请求时提供该值,并在从其他通道收到更新时更新该值

我的计划是: 使用juliazmq(zeromq),它侦听REP(reply)套接字,并将值传递给到达该REP套接字的任何请求。 此外,该程序还有一个SUB(subscribe)套接字,每当套接字接收到任何内容时,该套接字都会更新该值

REP套接字使用ZMQ.recv阻塞。 也许子插座也可以,不确定

但基本上,这两个部分都需要在while循环中独立运行,共享一些内存(变量)

因此,这可能需要使用SharedArrays、产卵过程来完成

但我就是不知道如何在代码中做到这一点。 例如,我可以@spawn每个这样的进程,一个有代表,一个有子套接字,但我不知道如何获得他们的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
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

虽然我不知道这是否是解决这个问题的最好方法,但下面的方法似乎有效


虽然我不知道这是否是解决这个问题的最好方法,但下面的方法似乎有效