62 lines
1.3 KiB
Tcl
62 lines
1.3 KiB
Tcl
#!/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
|
|
}
|
|
}
|