【问题标题】:Redis subscribe in julia script not workingRedis 在 Julia 脚本中订阅不起作用
【发布时间】:2016-04-13 08:30:25
【问题描述】:

我正在使用 Julia v0.4.5 并有这个简单的 Julia 脚本来订阅 redis 频道:

using Redis

subHandler(x) = print(x)
errHandler(err) = print(err)

redisConn = RedisConnection(host="127.0.0.1", port=6379, db=0)
flushall(redisConn)

subConn = open_subscription(redisConn, errHandler)
subscribe(subConn, "julia-channel", subHandler)

如果我在 Julia repl 中逐行键入此脚本,它会按预期工作。
但是,如果我将此代码放入脚本文件并从 shell 运行:

julia sub.jl

几秒钟后,Julia 退出时没有打印任何内容..
也许我应该将订阅放入某种线程或循环中(以保持 julia 运行)?

【问题讨论】:

  • println(subscribe(subConn, "julia-channel", subHandler))?
  • 我猜@FGFW 是在正确的轨道上。在 REPL 中运行时,您可能只是看到最后一行的输出(相当于在最后一行调用 display)。如果您希望脚本具有交互性,则需要将其添加到您的脚本中!
  • @FGFW println(subscribe(subConn, "julia-channel", subHandler)) 在 terimal 上打印 '47' 并且 julia 仍然退出。
  • @DanielArndt 在 repl 中,最后一行不打印任何内容。当订阅的频道上有数据发布时,subHandler(不是 subscribe())打印订阅的数据。根据 redis.jl 自述文件,subscribe()“生成一个在后台运行的例程以处理从服务器接收到的事件”。因此,我猜后台程序应该让 julia 继续运行,但事实并非如此......
  • 啊,有道理。 Julia 肯定不会为后台任务保持活力,这在过去给我造成了一些奇怪的“管道关闭”问题,尤其是在我尝试打印东西的测试中。

标签: redis julia publish-subscribe


【解决方案1】:

受 FGFW 和 DanielArndt 的启发,我刚刚找到了答案。
简而言之,在 subscribe() 之后,添加以下代码以保持 julia 运行:

while (true)
  sleep(1)
end

说明:
根据 redis.jl 自述文件,subscribe() 生成一个后台例程来处理服务器发布事件。但是,在脚本模式下,julia 主线程(例程)在 subscribe() 之后退出,因此后台例程也终止。 while - sleep 循环可防止主循环退出。
Repl 维护了用户交互循环,所以我们不必手动循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 2016-09-26
    • 2021-06-05
    • 2020-09-29
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多