pbdZMQ (version 0.3-2)

Poll Functions: Poll Functions

Description

Poll functions

Usage

zmq.poll(socket, type, timeout = -1L, MC = .pbd_env$ZMQ.MC)

zmq.poll.free()

zmq.poll.length()

zmq.poll.get.revents(index = 1L)

Arguments

socket

a vector of ZMQ sockets

type

a vector of socket types corresponding to socket argument

timeout

timeout for poll, see ZeroMQ manual for details

MC

a message control, see ZMQ.MC() for details

index

an index of ZMQ poll items to obtain revents

Value

zmq.poll() returns a ZMQ code and an errno, see ZeroMQ manual for details, no error/warning/interrupt in this R function, but some error/warning/interrupt may catch by the C function zmq_poll().

zmq.poll.length() returns the total number of poll items

zmq.poll.get.revents() returns the revent type

Details

zmq.poll() initials ZMQ poll items given ZMQ socket's and ZMQ poll type's. Both socket and type are in vectors of the same length, while socket contains socket pointers and type contains types of poll. See ZMQ.PO() for the possible values of type. ZMQ defines several poll types and utilize them to poll multiple sockets.

zmq.poll.free() frees ZMQ poll structure memory internally.

zmq.poll.length() obtains total numbers of ZMQ poll items.

zmq.poll.get.revents() obtains revent types from ZMQ poll item by the input index.

References

ZeroMQ/4.1.0 API Reference: http://api.zeromq.org/4-1:_start

Programming with Big Data in R Website: http://r-pbd.org/

See Also

zmq.recv(), zmq.send().

Examples

Run this code
# NOT RUN {
### Using poll pattern.
### See demo/mspoller.r for details.

### Run next in background or the other window.
SHELL> Rscript wuserver.r &
SHELL> Rscript taskvent.r &
SHELL> Rscript mspoller.r

### The mspoller.r has next.
library(pbdZMQ, quietly = TRUE)

### Initial.
context <- zmq.ctx.new()
receiver <- zmq.socket(context, .pbd_env$ZMQ.ST$PULL)
zmq.connect(receiver, "tcp://localhost:5557")
subscriber <- zmq.socket(context, .pbd_env$ZMQ.ST$SUB)
zmq.connect(subscriber, "tcp://localhost:5556")
zmq.setsockopt(subscriber, .pbd_env$ZMQ.SO$SUBSCRIBE, "20993")

### Process messages from both sockets.
cat("Press Ctrl+C or Esc to stop mspoller.\n")
i.rec <- 0
i.sub <- 0
while(TRUE){
  ### Set poller.
  zmq.poll(c(receiver, subscriber),
           c(.pbd_env$ZMQ.PO$POLLIN, .pbd_env$ZMQ.PO$POLLIN))

  ### Check receiver.
  if(bitwAnd(zmq.poll.get.revents(1), .pbd_env$ZMQ.PO$POLLIN)){
    ret <- zmq.recv(receiver)
    if(ret$len != -1){
      cat("task ventilator:", ret$buf, "at", i.rec, "\n")
      i.rec <- i.rec + 1
    }
  }

  ### Check subscriber.
  if(bitwAnd(zmq.poll.get.revents(2), .pbd_env$ZMQ.PO$POLLIN)){
    ret <- zmq.recv(subscriber)
    if(ret$len != -1){
      cat("weather update:", ret$buf, "at", i.sub, "\n")
      i.sub <- i.sub + 1
    }
  }

  if(i.rec >= 5 & i.sub >= 5){
    break
  }

  Sys.sleep(runif(1, 0.5, 1))
}

### Finish.
zmq.poll.free()
zmq.close(receiver)
zmq.close(subscriber)
zmq.ctx.destroy(context)
# }
# NOT RUN {
# }

Run the code above in your browser using DataCamp Workspace