diff options
Diffstat (limited to 'examples/redis-pubsub.tcl')
-rw-r--r-- | examples/redis-pubsub.tcl | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/examples/redis-pubsub.tcl b/examples/redis-pubsub.tcl new file mode 100644 index 0000000..ce0f78c --- /dev/null +++ b/examples/redis-pubsub.tcl @@ -0,0 +1,61 @@ +#!/usr/bin/env jimsh + +# Requires the redis extension +package require redis + +# A redis server should be running either on localhost 6379 +# or on the given host port +# +# Usage: redis-pubsub.tcl ?pub|sub? ?host:addr? +# +# If pub or sub is not given, forks and does both + +if {[lindex $argv 0] in {pub sub}} { + # Run in single process mode + set argv [lassign $argv op] +} else { + # fork before connecting so that both processes don't share + # a connection + if {[os.fork] == 0} { + # child subscribes + set op sub + } else { + set op pub + } +} + +try { + lassign $argv addr + if {$addr eq ""} { + set addr localhost:6379 + } + set r [redis [socket stream $addr]] +} on error msg { + puts [errorInfo $msg] + exit 1 +} + +if {$op eq "sub"} { + $r SUBSCRIBE chin + $r SUBSCRIBE chan + + $r readable { + after cancel $afterid + set result [$r read] + puts "$op: $result" + set afterid [after 2000 {incr done}] + } + # If no message for 2 seconds, stop + set afterid [after 2000 {incr done}] + vwait done + puts "$op: quitting on idle" +} else { + loop i 1 15 { + $r PUBLISH chan PONG$i + puts "$op: chan PONG$i" + after 250 + $r PUBLISH chin PING$i + puts "$op: chin PING$i" + after 250 + } +} |