本文整理汇总了Golang中github.com/kildevaeld/projects/Godeps/_workspace/src/github.com/pebbe/zmq4.NewPoller函数的典型用法代码示例。如果您正苦于以下问题:Golang NewPoller函数的具体用法?Golang NewPoller怎么用?Golang NewPoller使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NewPoller函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: ConnectToBroker
// Connect or reconnect to broker.
func (mdcli *Mdcli) ConnectToBroker() (err error) {
if mdcli.client != nil {
mdcli.client.Close()
mdcli.client = nil
}
mdcli.client, err = zmq.NewSocket(zmq.REQ)
if err != nil {
if mdcli.verbose {
log.Println("E: ConnectToBroker() creating socket failed")
}
return
}
mdcli.poller = zmq.NewPoller()
mdcli.poller.Add(mdcli.client, zmq.POLLIN)
if mdcli.verbose {
log.Printf("I: connecting to broker at %s...", mdcli.broker)
}
err = mdcli.client.Connect(mdcli.broker)
if err != nil && mdcli.verbose {
log.Println("E: ConnectToBroker() failed to connect to broker", mdcli.broker)
}
return
}
开发者ID:kildevaeld,项目名称:projects,代码行数:26,代码来源:mdcliapi.go
示例2: 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)
}
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:34,代码来源:mspoller.go
示例3: 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)
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:58,代码来源:flcliapi.go
示例4: 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)
}
}
}
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:55,代码来源:lvcache.go
示例5: 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
}
开发者ID:kildevaeld,项目名称:projects,代码行数:13,代码来源:ppworker.go
示例6: 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))
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:50,代码来源:peering1.go
示例7: 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)
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:47,代码来源:intface.go
示例8: 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()
}
开发者ID:kildevaeld,项目名称:projects,代码行数:47,代码来源:taskwork2.go
示例9: 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
}
开发者ID:kildevaeld,项目名称:projects,代码行数:18,代码来源:flclient1.go
示例10: 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
}
}
}
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:43,代码来源:rrbroker.go
示例11: 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
}
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:42,代码来源:peering3.go
示例12: ConnectToBroker
// Connect or reconnect to broker.
func (mdwrk *Mdwrk) ConnectToBroker() (err error) {
if mdwrk.worker != nil {
mdwrk.worker.Close()
mdwrk.worker = nil
}
mdwrk.worker, err = zmq.NewSocket(zmq.DEALER)
err = mdwrk.worker.Connect(mdwrk.broker)
if mdwrk.verbose {
log.Printf("I: connecting to broker at %s...\n", mdwrk.broker)
}
mdwrk.poller = zmq.NewPoller()
mdwrk.poller.Add(mdwrk.worker, zmq.POLLIN)
// Register service with broker
err = mdwrk.SendToBroker(MDPW_READY, mdwrk.service, []string{})
// If liveness hits zero, queue is considered disconnected
mdwrk.liveness = heartbeat_liveness
mdwrk.heartbeat_at = time.Now().Add(mdwrk.heartbeat)
return
}
开发者ID:kildevaeld,项目名称:projects,代码行数:23,代码来源:mdwrkapi.go
示例13: request
func (client *flclient_t) request(request ...string) (reply []string, err error) {
reply = []string{}
// Prefix request with sequence number and empty envelope
client.sequence++
// Blast the request to all connected servers
for server := 0; server < client.servers; server++ {
client.socket.SendMessage("", client.sequence, request)
}
// Wait for a matching reply to arrive from anywhere
// Since we can poll several times, calculate each one
endtime := time.Now().Add(GLOBAL_TIMEOUT)
poller := zmq.NewPoller()
poller.Add(client.socket, zmq.POLLIN)
for time.Now().Before(endtime) {
polled, err := poller.Poll(endtime.Sub(time.Now()))
if err == nil && len(polled) > 0 {
// Reply is [empty][sequence][OK]
reply, _ = client.socket.RecvMessage(0)
if len(reply) != 3 {
panic("len(reply) != 3")
}
sequence := reply[1]
reply = reply[2:]
sequence_nbr, _ := strconv.Atoi(sequence)
if sequence_nbr == client.sequence {
break
}
}
}
if len(reply) == 0 {
err = errors.New("No reply")
}
return
}
开发者ID:kildevaeld,项目名称:projects,代码行数:36,代码来源:flclient2.go
示例14: main
func main() {
// Prepare our sockets
frontend, _ := zmq.NewSocket(zmq.ROUTER)
backend, _ := zmq.NewSocket(zmq.ROUTER)
defer frontend.Close()
defer backend.Close()
frontend.Bind("ipc://frontend.ipc")
backend.Bind("ipc://backend.ipc")
client_nbr := 0
for ; client_nbr < NBR_CLIENTS; client_nbr++ {
go client_task()
}
for worker_nbr := 0; worker_nbr < NBR_WORKERS; worker_nbr++ {
go worker_task()
}
// Here is the main loop for the least-recently-used queue. It has two
// sockets; a frontend for clients and a backend for workers. It polls
// the backend in all cases, and polls the frontend only when there are
// one or more workers ready. This is a neat way to use 0MQ's own queues
// to hold messages we're not ready to process yet. When we get a client
// reply, we pop the next available worker, and send the request to it,
// including the originating client identity. When a worker replies, we
// re-queue that worker, and we forward the reply to the original client,
// using the reply envelope.
// Queue of available workers
worker_queue := make([]string, 0, 10)
poller1 := zmq.NewPoller()
poller1.Add(backend, zmq.POLLIN)
poller2 := zmq.NewPoller()
poller2.Add(backend, zmq.POLLIN)
poller2.Add(frontend, zmq.POLLIN)
for client_nbr > 0 {
// Poll frontend only if we have available workers
var sockets []zmq.Polled
if len(worker_queue) > 0 {
sockets, _ = poller2.Poll(-1)
} else {
sockets, _ = poller1.Poll(-1)
}
for _, socket := range sockets {
switch socket.Socket {
case backend:
// Handle worker activity on backend
// Queue worker identity for load-balancing
worker_id, _ := backend.Recv(0)
if !(len(worker_queue) < NBR_WORKERS) {
panic("!(len(worker_queue) < NBR_WORKERS)")
}
worker_queue = append(worker_queue, worker_id)
// Second frame is empty
empty, _ := backend.Recv(0)
if empty != "" {
panic(fmt.Sprintf("empty is not \"\": %q", empty))
}
// Third frame is READY or else a client reply identity
client_id, _ := backend.Recv(0)
// If client reply, send rest back to frontend
if client_id != "READY" {
empty, _ := backend.Recv(0)
if empty != "" {
panic(fmt.Sprintf("empty is not \"\": %q", empty))
}
reply, _ := backend.Recv(0)
frontend.Send(client_id, zmq.SNDMORE)
frontend.Send("", zmq.SNDMORE)
frontend.Send(reply, 0)
client_nbr--
}
case frontend:
// Here is how we handle a client request:
// Now get next client request, route to last-used worker
// Client request is [identity][empty][request]
client_id, _ := frontend.Recv(0)
empty, _ := frontend.Recv(0)
if empty != "" {
panic(fmt.Sprintf("empty is not \"\": %q", empty))
}
request, _ := frontend.Recv(0)
backend.Send(worker_queue[0], zmq.SNDMORE)
backend.Send("", zmq.SNDMORE)
backend.Send(client_id, zmq.SNDMORE)
backend.Send("", zmq.SNDMORE)
backend.Send(request, 0)
// Dequeue and drop the next worker identity
worker_queue = worker_queue[1:]
}
//.........这里部分代码省略.........
开发者ID:kildevaeld,项目名称:projects,代码行数:101,代码来源:lbbroker.go
示例15: Example_test_disconnect_inproc
func Example_test_disconnect_inproc() {
publicationsReceived := 0
isSubscribed := false
pubSocket, err := zmq.NewSocket(zmq.XPUB)
if checkErr(err) {
return
}
subSocket, err := zmq.NewSocket(zmq.SUB)
if checkErr(err) {
return
}
err = subSocket.SetSubscribe("foo")
if checkErr(err) {
return
}
err = pubSocket.Bind("inproc://someInProcDescriptor")
if checkErr(err) {
return
}
iteration := 0
poller := zmq.NewPoller()
poller.Add(subSocket, zmq.POLLIN) // read publications
poller.Add(pubSocket, zmq.POLLIN) // read subscriptions
for {
sockets, err := poller.Poll(100 * time.Millisecond)
if checkErr(err) {
break // Interrupted
}
for _, socket := range sockets {
if socket.Socket == pubSocket {
for {
buffer, err := pubSocket.Recv(0)
if checkErr(err) {
return
}
fmt.Printf("pubSocket: %q\n", buffer)
if buffer[0] == 0 {
fmt.Println("pubSocket, isSubscribed == true:", isSubscribed == true)
isSubscribed = false
} else {
fmt.Println("pubSocket, isSubscribed == false:", isSubscribed == false)
isSubscribed = true
}
more, err := pubSocket.GetRcvmore()
if checkErr(err) {
return
}
if !more {
break // Last message part
}
}
break
}
}
for _, socket := range sockets {
if socket.Socket == subSocket {
for {
msg, err := subSocket.Recv(0)
if checkErr(err) {
return
}
fmt.Printf("subSocket: %q\n", msg)
more, err := subSocket.GetRcvmore()
if checkErr(err) {
return
}
if !more {
publicationsReceived++
break // Last message part
}
}
break
}
}
if iteration == 1 {
err := subSocket.Connect("inproc://someInProcDescriptor")
checkErr(err)
}
if iteration == 4 {
err := subSocket.Disconnect("inproc://someInProcDescriptor")
checkErr(err)
}
if iteration > 4 && len(sockets) == 0 {
break
}
_, err = pubSocket.Send("foo", zmq.SNDMORE)
checkErr(err)
_, err = pubSocket.Send("this is foo!", 0)
//.........这里部分代码省略.........
开发者ID:kildevaeld,项目名称:projects,代码行数:101,代码来源:zmq4_test.go
示例16: state_manager
func state_manager() {
kvmap := make(map[string]*kvsimple.Kvmsg)
pipe, _ := zmq.NewSocket(zmq.PAIR)
pipe.Connect("inproc://pipe")
pipe.SendMessage("READY")
snapshot, _ := zmq.NewSocket(zmq.ROUTER)
snapshot.Bind("tcp://*:5556")
poller := zmq.NewPoller()
poller.Add(pipe, zmq.POLLIN)
poller.Add(snapshot, zmq.POLLIN)
sequence := int64(0) // Current snapshot version number
LOOP:
for {
polled, err := poller.Poll(-1)
if err != nil {
break // Context has been shut down
}
for _, item := range polled {
switch socket := item.Socket; socket {
case pipe:
// Apply state update from main thread
kvmsg, err := kvsimple.RecvKvmsg(pipe)
if err != nil {
break LOOP // Interrupted
}
sequence, _ = kvmsg.GetSequence()
kvmsg.Store(kvmap)
case snapshot:
// Execute state snapshot request
msg, err := snapshot.RecvMessage(0)
if err != nil {
break LOOP // Interrupted
}
identity := msg[0]
// Request is in second frame of message
request := msg[1]
if request != "ICANHAZ?" {
fmt.Println("E: bad request, aborting")
break LOOP
}
// Send state snapshot to client
// For each entry in kvmap, send kvmsg to client
for _, kvmsg := range kvmap {
snapshot.Send(identity, zmq.SNDMORE)
kvmsg.Send(snapshot)
}
// Give client some time to deal with it.
// This reduces the risk that the client won't see
// the END message, but it doesn't eliminate the risk.
time.Sleep(100 * time.Millisecond)
// Now send END message with sequence number
fmt.Printf("Sending state shapshot=%d\n", sequence)
snapshot.Send(identity, zmq.SNDMORE)
kvmsg := kvsimple.NewKvmsg(sequence)
kvmsg.SetKey("KTHXBAI")
kvmsg.SetBody("")
kvmsg.Send(snapshot)
}
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:66,代码来源:clonesrv2.go
示例17: main
func main() {
snapshot, _ := zmq.NewSocket(zmq.DEALER)
snapshot.Connect("tcp://localhost:5556")
subscriber, _ := zmq.NewSocket(zmq.SUB)
subscriber.SetSubscribe("")
subscriber.Connect("tcp://localhost:5557")
publisher, _ := zmq.NewSocket(zmq.PUSH)
publisher.Connect("tcp://localhost:5558")
kvmap := make(map[string]*kvsimple.Kvmsg)
rand.Seed(time.Now().UnixNano())
// We first request a state snapshot:
sequence := int64(0)
snapshot.SendMessage("ICANHAZ?")
for {
kvmsg, err := kvsimple.RecvKvmsg(snapshot)
if err != nil {
break // Interrupted
}
if key, _ := kvmsg.GetKey(); key == "KTHXBAI" {
sequence, _ := kvmsg.GetSequence()
fmt.Println("I: received snapshot =", sequence)
break // Done
}
kvmsg.Store(kvmap)
}
snapshot.Close()
// Now we wait for updates from the server, and every so often, we
// send a random key-value update to the server:
poller := zmq.NewPoller()
poller.Add(subscriber, zmq.POLLIN)
alarm := time.Now().Add(1000 * time.Millisecond)
for {
tickless := alarm.Sub(time.Now())
if tickless < 0 {
tickless = 0
}
polled, err := poller.Poll(tickless)
if err != nil {
break // Context has been shut down
}
if len(polled) == 1 {
kvmsg, err := kvsimple.RecvKvmsg(subscriber)
if err != nil {
break // Interrupted
}
// Discard out-of-sequence kvmsgs, incl. heartbeats
if seq, _ := kvmsg.GetSequence(); seq > sequence {
sequence = seq
kvmsg.Store(kvmap)
fmt.Println("I: received update =", sequence)
}
}
// If we timed-out, generate a random kvmsg
if time.Now().After(alarm) {
kvmsg := kvsimple.NewKvmsg(0)
kvmsg.SetKey(fmt.Sprint(rand.Intn(10000)))
kvmsg.SetBody(fmt.Sprint(rand.Intn(1000000)))
kvmsg.Send(publisher)
alarm = time.Now().Add(1000 * time.Millisecond)
}
}
fmt.Printf("Interrupted\n%d messages in\n", sequence)
}
开发者ID:kildevaeld,项目名称:projects,代码行数:68,代码来源:clonecli3.go
示例18: main
func main() {
// Arguments can be either of:
// -p primary server, at tcp://localhost:5001
// -b backup server, at tcp://localhost:5002
statepub, _ := zmq.NewSocket(zmq.PUB)
statesub, _ := zmq.NewSocket(zmq.SUB)
statesub.SetSubscribe("")
frontend, _ := zmq.NewSocket(zmq.ROUTER)
fsm := &bstar_t{peer_expiry: time.Now().Add(2 * HEARTBEAT)}
if len(os.Args) == 2 && os.Args[1] == "-p" {
fmt.Println("I: Primary active, waiting for backup (passive)")
frontend.Bind("tcp://*:5001")
statepub.Bind("tcp://*:5003")
statesub.Connect("tcp://localhost:5004")
fsm.state = STATE_PRIMARY
} else if len(os.Args) == 2 && os.Args[1] == "-b" {
fmt.Println("I: Backup passive, waiting for primary (active)")
frontend.Bind("tcp://*:5002")
statepub.Bind("tcp://*:5004")
statesub.Connect("tcp://localhost:5003")
fsm.state = STATE_BACKUP
} else {
fmt.Println("Usage: bstarsrv { -p | -b }")
return
}
// We now process events on our two input sockets, and process these
// events one at a time via our finite-state machine. Our "work" for
// a client request is simply to echo it back:
// Set timer for next outgoing state message
send_state_at := time.Now().Add(HEARTBEAT)
poller := zmq.NewPoller()
poller.Add(frontend, zmq.POLLIN)
poller.Add(statesub, zmq.POLLIN)
LOOP:
for {
time_left := send_state_at.Sub(time.Now())
if time_left < 0 {
time_left = 0
}
polled, err := poller.Poll(time_left)
if err != nil {
break // Context has been shut down
}
for _, socket := range polled {
switch socket.Socket {
case frontend:
// Have a client request
msg, _ := frontend.RecvMessage(0)
fsm.event = CLIENT_REQUEST
if !StateMachine(fsm) {
// Answer client by echoing request back
frontend.SendMessage(msg)
}
case statesub:
// Have state from our peer, execute as event
message, _ := statesub.RecvMessage(0)
i, _ := strconv.Atoi(message[0])
fsm.event = event_t(i)
if StateMachine(fsm) {
break LOOP // Error, so exit
}
fsm.peer_expiry = time.Now().Add(2 * HEARTBEAT)
}
}
// If we timed-out, send state to peer
if time.Now().After(send_state_at) {
statepub.SendMessage(int(fsm.state))
send_state_at = time.Now().Add(HEARTBEAT)
}
}
fmt.Println("W: interrupted")
}
开发者ID:kildevaeld,项目名称:projects,代码行数:76,代码来源:bstarsrv.go
示例19: main
func main() {
server := []string{"tcp://localhost:5001", "tcp://localhost:5002"}
server_nbr := 0
fmt.Printf("I: connecting to server at %s...\n", server[server_nbr])
client, _ := zmq.NewSocket(zmq.REQ)
client.Connect(server[server_nbr])
poller := zmq.NewPoller()
poller.Add(client, zmq.POLLIN)
sequence := 0
LOOP:
for {
// We send a request, then we work to get a reply
sequence++
client.SendMessage(sequence)
for expect_reply := true; expect_reply; {
// Poll socket for a reply, with timeout
polled, err := poller.Poll(REQUEST_TIMEOUT)
if err != nil {
break LOOP // Interrupted
}
// We use a Lazy Pirate strategy in the client. If there's no
// reply within our timeout, we close the socket and try again.
// In Binary Star, it's the client vote which decides which
// server is primary; the client must therefore try to connect
// to each server in turn:
if len(polled) == 1 {
// We got a reply from the server, must match sequence
reply, _ := client.RecvMessage(0)
seq, _ := strconv.Atoi(reply[0])
if seq == sequence {
fmt.Printf("I: server replied OK (%s)\n", reply[0])
expect_reply = false
time.Sleep(time.Second) // One request per second
} else {
fmt.Printf("E: bad reply from server: %q\n", reply)
}
} else {
fmt.Println("W: no response from server, failing over")
// Old socket is confused; close it and open a new one
client.Close()
server_nbr = 1 - server_nbr
time.Sleep(SETTLE_DELAY)
fmt.Printf("I: connecting to server at %s...\n", server[server_nbr])
client, _ = zmq.NewSocket(zmq.REQ)
client.Connect(server[server_nbr])
poller = zmq.NewPoller()
poller.Add(client, zmq.POLLIN)
// Send request again, on new socket
client.SendMessage(sequence)
}
}
}
}
开发者ID:kildevaeld,项目名称:projects,代码行数:64,代码来源:bstarcli.go
示例20: main
func main() {
// Prepare our sockets
frontend, _ := zmq.NewSocket(zmq.ROUTER)
backend, _ := zmq.NewSocket(zmq.ROUTER)
defer frontend.Close()
defer backend.Close()
frontend.Bind("ipc://frontend.ipc")
backend.Bind("ipc://backend.ipc")
for client_nbr := 0; client_nbr < NBR_CLIENTS; client_nbr++ {
go client_task()
}
for worker_nbr := 0; worker_nbr < NBR_WORKERS; worker_nbr++ {
go worker_task()
}
// Queue of available workers
workers := make([]string, 0, 10)
poller1 := zmq.NewPoller()
poller1.Add(backend, zmq.POLLIN)
poller2 := zmq.NewPoller()
poller2.Add(backend, zmq.POLLIN)
poller2.Add(frontend, zmq.POLLIN)
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 socket.Socket {
case backend:
// Handle worker activity on backend
// Use worker identity for load-balancing
msg, err := backend.RecvMessage(0)
if err != nil {
break LOOP // Interrupted
}
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 := frontend.RecvMessage(0)
if err == nil {
backend.SendMessage(workers[0], "", msg)
workers = workers[1:]
}
}
}
}
time.Sleep(100 * time.Millisecond)
}
开发者ID:kildevaeld,项目名称:projects,代码行数:69,代码来源:lbbroker2.go
注:本文中的github.com/kildevaeld/projects/Godeps/_workspace/src/github.com/pebbe/zmq4.NewPoller函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论