本文整理汇总了Golang中github.com/pebbe/zmq3.NewPoller函数的典型用法代码示例。如果您正苦于以下问题:Golang NewPoller函数的具体用法?Golang NewPoller怎么用?Golang NewPoller使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NewPoller函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: main
func main() {
frontend, _ := zmq.NewSocket(zmq.ROUTER)
backend, _ := zmq.NewSocket(zmq.ROUTER)
defer frontend.Close()
defer backend.Close()
frontend.Bind("tcp://*:5555") // For clients
backend.Bind("tcp://*:5556") // For workers
// Queue of available workers
workers := make([]string, 0)
poller1 := zmq.NewPoller()
poller1.Add(backend, zmq.POLLIN)
poller2 := zmq.NewPoller()
poller2.Add(backend, zmq.POLLIN)
poller2.Add(frontend, zmq.POLLIN)
// The body of this example is exactly the same as lbbroker2.
LOOP:
for {
// Poll frontend only if we have available workers
var sockets []zmq.Polled
var err error
if len(workers) > 0 {
sockets, err = poller2.Poll(-1)
} else {
sockets, err = poller1.Poll(-1)
}
if err != nil {
break // Interrupted
}
for _, socket := range sockets {
switch s := socket.Socket; s {
case backend: // Handle worker activity on backend
// Use worker identity for load-balancing
msg, err := s.RecvMessage(0)
if err != nil {
break LOOP // Interrupted
}
var identity string
identity, msg = unwrap(msg)
workers = append(workers, identity)
// Forward message to client if it's not a READY
if msg[0] != WORKER_READY {
frontend.SendMessage(msg)
}
case frontend:
// Get client request, route to first available worker
msg, err := s.RecvMessage(0)
if err == nil {
backend.SendMessage(workers[0], "", msg)
workers = workers[1:]
}
}
}
}
}
示例2: ConnectToBroker
// Connect or reconnect to broker. In this asynchronous class we use a
// DEALER socket instead of a REQ socket; this lets us send any number
// of requests without waiting for a reply.
func (mdcli2 *Mdcli2) ConnectToBroker() (err error) {
if mdcli2.client != nil {
mdcli2.client.Close()
mdcli2.client = nil
}
mdcli2.client, err = zmq.NewSocket(zmq.DEALER)
if err != nil {
if mdcli2.verbose {
log.Println("E: ConnectToBroker() creating socket failed")
}
return
}
mdcli2.poller = zmq.NewPoller()
mdcli2.poller.Add(mdcli2.client, zmq.POLLIN)
if mdcli2.verbose {
log.Printf("I: connecting to broker at %s...", mdcli2.broker)
}
err = mdcli2.client.Connect(mdcli2.broker)
if err != nil && mdcli2.verbose {
log.Println("E: ConnectToBroker() failed to connect to broker", mdcli2.broker)
}
return
}
示例3: main
func main() {
// Connect to task ventilator
receiver, _ := zmq.NewSocket(zmq.PULL)
defer receiver.Close()
receiver.Connect("tcp://localhost:5557")
// Connect to weather server
subscriber, _ := zmq.NewSocket(zmq.SUB)
defer subscriber.Close()
subscriber.Connect("tcp://localhost:5556")
subscriber.SetSubscribe("10001 ")
// Initialize poll set
poller := zmq.NewPoller()
poller.Add(receiver, zmq.POLLIN)
poller.Add(subscriber, zmq.POLLIN)
// Process messages from both sockets
for {
sockets, _ := poller.Poll(-1)
for _, socket := range sockets {
switch s := socket.Socket; s {
case receiver:
task, _ := s.Recv(0)
// Process task
fmt.Println("Got task:", task)
case subscriber:
update, _ := s.Recv(0)
// Process weather update
fmt.Println("Got weather update:", update)
}
}
}
}
示例4: flcliapi_agent
func flcliapi_agent() {
agent := agent_new()
poller := zmq.NewPoller()
poller.Add(agent.pipe, zmq.POLLIN)
poller.Add(agent.router, zmq.POLLIN)
for {
// Calculate tickless timer, up to 1 hour
tickless := time.Now().Add(time.Hour)
if len(agent.request) > 0 && tickless.After(agent.expires) {
tickless = agent.expires
}
for key := range agent.servers {
tickless = agent.servers[key].tickless(tickless)
}
polled, err := poller.Poll(tickless.Sub(time.Now()))
if err != nil {
break // Context has been shut down
}
for _, item := range polled {
switch item.Socket {
case agent.pipe:
agent.control_message()
case agent.router:
agent.router_message()
}
}
// If we're processing a request, dispatch to next server
if len(agent.request) > 0 {
if time.Now().After(agent.expires) {
// Request expired, kill it
agent.pipe.SendMessage("FAILED")
agent.request = agent.request[0:0]
} else {
// Find server to talk to, remove any expired ones
for len(agent.actives) > 0 {
server := agent.actives[0]
if time.Now().After(server.expires) {
agent.actives = agent.actives[1:]
server.alive = false
} else {
agent.router.SendMessage(server.endpoint, agent.request)
break
}
}
}
}
// --(Disconnect and delete any expired servers)--
// Send heartbeats to idle servers if needed
for key := range agent.servers {
agent.servers[key].ping(agent.router)
}
}
}
示例5: main
func main() {
frontend, _ := zmq.NewSocket(zmq.SUB)
frontend.Bind("tcp://*:5557")
backend, _ := zmq.NewSocket(zmq.XPUB)
backend.Bind("tcp://*:5558")
// Subscribe to every single topic from publisher
frontend.SetSubscribe("")
// Store last instance of each topic in a cache
cache := make(map[string]string)
// We route topic updates from frontend to backend, and
// we handle subscriptions by sending whatever we cached,
// if anything:
poller := zmq.NewPoller()
poller.Add(frontend, zmq.POLLIN)
poller.Add(backend, zmq.POLLIN)
LOOP:
for {
polled, err := poller.Poll(1000 * time.Millisecond)
if err != nil {
break // Interrupted
}
for _, item := range polled {
switch socket := item.Socket; socket {
case frontend:
// Any new topic data we cache and then forward
msg, err := frontend.RecvMessage(0)
if err != nil {
break LOOP
}
cache[msg[0]] = msg[1]
backend.SendMessage(msg)
case backend:
// When we get a new subscription we pull data from the cache:
msg, err := backend.RecvMessage(0)
if err != nil {
break LOOP
}
frame := msg[0]
// Event is one byte 0=unsub or 1=sub, followed by topic
if frame[0] == 1 {
topic := frame[1:]
fmt.Println("Sending cached topic", topic)
previous, ok := cache[topic]
if ok {
backend.SendMessage(topic, previous)
}
}
}
}
}
}
示例6: Run
func (src ZmqSource) Run() error {
//the socket has to run from the same goroutine because it is not thread safe
//memory barrier executed when goroutines moved between threads
//reference: https://groups.google.com/forum/#!topic/golang-nuts/eABYrBA5LEk
defer close(src.Out())
socket, err := zmqapi.NewSocket(zmqapi.PULL)
if err != nil {
log.Fatal(err)
}
defer socket.Close()
socket.SetRcvhwm(src.hwm)
err = socket.Bind(src.addr)
if err != nil {
log.Fatal(err)
return err
}
/* using poller to allow for a timeout*/
/* alternate between polling the zmq socket and the close channel */
/* This method introduces a lag to close, but thats probably ok*/
/* pebbe/zmq3 (zmqapi) has a Reactor to do something similar but has the same */
/* lag problem and is way more complex than we need */
poller := zmqapi.NewPoller()
poller.Add(socket, zmqapi.POLLIN)
count := 0
sent := 0
for {
count++
sockets, err := poller.Poll(time.Second)
if err != nil {
return err
}
if len(sockets) > 0 {
buf, err := socket.RecvBytes(0)
if err != nil {
return err
}
sent++
src.Out() <- buf
}
select {
case <-src.StopNotifier:
log.Println("Closing: count ", count, "Sent:", sent)
return nil
default:
}
}
}
示例7: main
func main() {
verbose := false
if len(os.Args) > 1 && os.Args[1] == "-v" {
verbose = true
}
broker, _ := NewBroker(verbose)
broker.Bind("tcp://*:5555")
poller := zmq.NewPoller()
poller.Add(broker.socket, zmq.POLLIN)
// Get and process messages forever or until interrupted
for {
polled, err := poller.Poll(HEARTBEAT_INTERVAL)
if err != nil {
break // Interrupted
}
// Process next input message, if any
if len(polled) > 0 {
msg, err := broker.socket.RecvMessage(0)
if err != nil {
break // Interrupted
}
if broker.verbose {
log.Printf("I: received message: %q\n", msg)
}
sender, msg := popStr(msg)
_, msg = popStr(msg)
header, msg := popStr(msg)
switch header {
case mdapi.MDPC_CLIENT:
broker.ClientMsg(sender, msg)
case mdapi.MDPW_WORKER:
broker.WorkerMsg(sender, msg)
default:
log.Printf("E: invalid message: %q\n", msg)
}
}
// Disconnect and delete any expired workers
// Send heartbeats to idle workers if needed
if time.Now().After(broker.heartbeat_at) {
broker.Purge()
for _, worker := range broker.waiting {
worker.Send(mdapi.MDPW_HEARTBEAT, "", []string{})
}
broker.heartbeat_at = time.Now().Add(HEARTBEAT_INTERVAL)
}
}
log.Println("W: interrupt received, shutting down...")
}
示例8: s_worker_socket
func s_worker_socket() (*zmq.Socket, *zmq.Poller) {
worker, _ := zmq.NewSocket(zmq.DEALER)
worker.Connect("tcp://localhost:5556")
// Tell queue we're ready for work
fmt.Println("I: worker ready")
worker.Send(PPP_READY, 0)
poller := zmq.NewPoller()
poller.Add(worker, zmq.POLLIN)
return worker, poller
}
示例9: main
func main() {
// First argument is this broker's name
// Other arguments are our peers' names
//
if len(os.Args) < 2 {
fmt.Println("syntax: peering1 me {you}...")
os.Exit(1)
}
self := os.Args[1]
fmt.Printf("I: preparing broker at %s...\n", self)
rand.Seed(time.Now().UnixNano())
// Bind state backend to endpoint
statebe, _ := zmq.NewSocket(zmq.PUB)
defer statebe.Close()
statebe.Bind("ipc://" + self + "-state.ipc")
// Connect statefe to all peers
statefe, _ := zmq.NewSocket(zmq.SUB)
defer statefe.Close()
statefe.SetSubscribe("")
for _, peer := range os.Args[2:] {
fmt.Printf("I: connecting to state backend at '%s'\n", peer)
statefe.Connect("ipc://" + peer + "-state.ipc")
}
// The main loop sends out status messages to peers, and collects
// status messages back from peers. The zmq_poll timeout defines
// our own heartbeat:
poller := zmq.NewPoller()
poller.Add(statefe, zmq.POLLIN)
for {
// Poll for activity, or 1 second timeout
sockets, err := poller.Poll(time.Second)
if err != nil {
break
}
// Handle incoming status messages
if len(sockets) == 1 {
msg, _ := statefe.RecvMessage(0)
peer_name := msg[0]
available := msg[1]
fmt.Printf("%s - %s workers free\n", peer_name, available)
} else {
statebe.SendMessage(self, rand.Intn(10))
}
}
}
示例10: main
func main() {
// Socket to receive messages on
receiver, _ := zmq.NewSocket(zmq.PULL)
defer receiver.Close()
receiver.Connect("tcp://localhost:5557")
// Socket to send messages to
sender, _ := zmq.NewSocket(zmq.PUSH)
defer sender.Close()
sender.Connect("tcp://localhost:5558")
// Socket for control input
controller, _ := zmq.NewSocket(zmq.SUB)
defer controller.Close()
controller.Connect("tcp://localhost:5559")
controller.SetSubscribe("")
// Process messages from receiver and controller
poller := zmq.NewPoller()
poller.Add(receiver, zmq.POLLIN)
poller.Add(controller, zmq.POLLIN)
// Process messages from both sockets
LOOP:
for {
sockets, _ := poller.Poll(-1)
for _, socket := range sockets {
switch s := socket.Socket; s {
case receiver:
msg, _ := s.Recv(0)
// Do the work
t, _ := strconv.Atoi(msg)
time.Sleep(time.Duration(t) * time.Millisecond)
// Send results to sink
sender.Send(msg, 0)
// Simple progress indicator for the viewer
fmt.Printf(".")
case controller:
// Any controller command acts as 'KILL'
break LOOP // Exit loop
}
}
}
fmt.Println()
}
示例11: agent
func (iface *Intface) agent() {
// Create agent instance to pass around
agent := new_agent()
// Send first beacon immediately
ping_at := time.Now()
poller := zmq.NewPoller()
poller.Add(agent.pipe, zmq.POLLIN)
poller.Add(agent.udp, zmq.POLLIN)
bcast := &net.UDPAddr{Port: PING_PORT_NUMBER, IP: net.IPv4bcast}
for {
timeout := ping_at.Add(time.Millisecond).Sub(time.Now())
if timeout < 0 {
timeout = 0
}
polled, err := poller.Poll(timeout)
if err != nil {
break
}
for _, item := range polled {
switch socket := item.Socket; socket {
case agent.pipe:
// If we had activity on the pipe, go handle the control
// message. Current code never sends control messages.
agent.control_message()
case agent.udp:
// If we had input on the UDP socket, go process that
agent.handle_beacon()
}
}
// If we passed the 1-second mark, broadcast our beacon
now := time.Now()
if now.After(ping_at) {
agent.conn.WriteTo(agent.uuid_bytes, bcast)
ping_at = now.Add(PING_INTERVAL)
}
// Delete and report any expired peers
for _, peer := range agent.peers {
agent.reap_peer(peer)
}
}
}
示例12: try_request
func try_request(endpoint string, request []string) (reply []string, err error) {
fmt.Printf("I: trying echo service at %s...\n", endpoint)
client, _ := zmq.NewSocket(zmq.REQ)
client.Connect(endpoint)
// Send request, wait safely for reply
client.SendMessage(request)
poller := zmq.NewPoller()
poller.Add(client, zmq.POLLIN)
polled, err := poller.Poll(REQUEST_TIMEOUT)
reply = []string{}
if len(polled) == 1 {
reply, err = client.RecvMessage(0)
} else {
err = errors.New("Time out")
}
return
}
示例13: main
func main() {
// Prepare our sockets
frontend, _ := zmq.NewSocket(zmq.ROUTER)
defer frontend.Close()
backend, _ := zmq.NewSocket(zmq.DEALER)
defer backend.Close()
frontend.Bind("tcp://*:5559")
backend.Bind("tcp://*:5560")
// Initialize poll set
poller := zmq.NewPoller()
poller.Add(frontend, zmq.POLLIN)
poller.Add(backend, zmq.POLLIN)
// Switch messages between sockets
for {
sockets, _ := poller.Poll(-1)
for _, socket := range sockets {
switch s := socket.Socket; s {
case frontend:
for {
msg, _ := s.Recv(0)
if more, _ := s.GetRcvmore(); more {
backend.Send(msg, zmq.SNDMORE)
} else {
backend.Send(msg, 0)
break
}
}
case backend:
for {
msg, _ := s.Recv(0)
if more, _ := s.GetRcvmore(); more {
frontend.Send(msg, zmq.SNDMORE)
} else {
frontend.Send(msg, 0)
break
}
}
}
}
}
}
示例14: client_task
func client_task(i int) {
client, _ := zmq.NewSocket(zmq.REQ)
defer client.Close()
client.Connect("ipc://" + self + "-localfe.ipc")
monitor, _ := zmq.NewSocket(zmq.PUSH)
defer monitor.Close()
monitor.Connect("ipc://" + self + "-monitor.ipc")
poller := zmq.NewPoller()
poller.Add(client, zmq.POLLIN)
for {
time.Sleep(time.Duration(rand.Intn(5000)) * time.Millisecond)
for burst := rand.Intn(15); burst > 0; burst-- {
task_id := fmt.Sprintf("%04X-%s-%d", rand.Intn(0x10000), self, i)
// Send request with random hex ID
client.Send(task_id, 0)
// Wait max ten seconds for a reply, then complain
sockets, err := poller.Poll(10 * time.Second)
if err != nil {
break // Interrupted
}
if len(sockets) == 1 {
reply, err := client.Recv(0)
if err != nil {
break // Interrupted
}
// Worker is supposed to answer us with our task id
id := strings.Fields(reply)[0]
if id != task_id {
panic("id != task_id")
}
monitor.Send(reply, 0)
} else {
monitor.Send("E: CLIENT EXIT - lost task "+task_id, 0)
return
}
}
}
}
示例15: ProcessEvents
func ProcessEvents(self string, statebe, statefe *zmq.Socket) {
poller := zmq.NewPoller()
poller.Add(statefe, zmq.POLLIN)
for {
// Poll for activity, or 1 second timeout
sockets, err := poller.Poll(time.Second)
if err != nil {
break
}
// Handle incoming status messages
if len(sockets) == 1 {
msg, _ := statefe.RecvMessage(0)
peerName := msg[0]
available := msg[1]
fmt.Printf("%s - %s workers free\n", peerName, available)
} else {
statebe.SendMessage(self, rand.Intn(10))
}
}
}