2016-04-13 6 views
2

Я использую Julia v0.4.5 и есть этот простой JuLiA скрипт для подписки из Redis канала: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 sub.jl 

Джулия выходит ничего не напечатано через несколько секунд ..
Может быть, я должен поставить подписку в какой-то теме или цикл (чтобы сохранить julia)?

+2

println (подписаться (subConn, «julia-channel», subHandler))? –

+2

Я бы предположил, что @FGFW находится на правильном пути. Вероятно, вы просто видите вывод последней строки при работе в REPL (что эквивалентно вызову 'display' на последней строке). Если вы хотите, чтобы скрипт был интерактивным, вам нужно добавить его в свой скрипт! –

+0

@FGFW println (subscribe (subConn, "julia-channel", subHandler)) печатает '47' на terimal и julia по-прежнему выходит. – xiedidan

ответ

2

Вдохновленный FGFW и DanielArndt, я только что нашел ответ.
Короче говоря, после того, как подписаться(), добавив следующий код, чтобы сохранить JuLiA пробег:

while (true) 
    sleep(1) 
end 

Объяснение:
Согласно redis.jl ридми, подписаться() порождает фоновый режим для того чтобы обрабатывать сервер публиковать события. Однако в режиме сценария главный поток julia (подпрограмма) выходит после subscribe(), так что фоновая процедура также завершается. Цикл while - sleep предотвращает выход основной петли.
Repl поддерживает пользовательский интерактивный цикл, поэтому нам не нужно зацикливаться вручную.

Смежные вопросы