### Task ventilator send to two workers as in the ZeroMQ guide.
# SHELL> Rscript taskwork.r &
# SHELL> Rscript taskvent.r; Rscript tasksink.r
### Remember to kill two worker processors at the end, such as
# SHELL> ps -x|grep "file=task.*\.r"|sed "s/\(.*\) pts.*/\1/"|xargs kill -9

suppressMessages(library(pbdZMQ, quietly = TRUE))

### Initial.
context <- zmq.ctx.new()
sender <- zmq.socket(context, ZMQ.ST()$PUSH)
zmq.bind(sender, "tcp://*:5557")
sink <- zmq.socket(context, ZMQ.ST()$PUSH)
zmq.connect(sink, "tcp://localhost:5558")

### Send sink.
readline("Press Enter when workers are ready:")
cat("Sending tasks to workers ...\n")
zmq.send(sink, "0")

### Send 100 tasks.
set.seed(1234)
total.msec <- 0
for(i in 1:100){
  workload <- as.integer(runif(1, 1, 30))
  total.msec <- total.msec + workload
  string <- sprintf("%d", workload)
  zmq.send(sender, string)
  Sys.sleep(runif(1, 3, 5))
}
cat("Total expected cost: ", total.msec, " msec\n", sep = "")

### Finish.
zmq.close(sink)
zmq.close(sender)
zmq.ctx.destroy(context)
