mirror of
https://github.com/luxfi/zmq.git
synced 2026-10-30 15:11:11 +00:00
117 lines
2.2 KiB
Go
117 lines
2.2 KiB
Go
// Copyright 2018 The go-zeromq Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
//go:build ignore
|
|
// +build ignore
|
|
|
|
// Router/Dealer example.
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"math/rand"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/luxfi/zmq/v4"
|
|
)
|
|
|
|
const (
|
|
NWORKERS = 10
|
|
endpoint = "tcp://localhost:5671"
|
|
)
|
|
|
|
var (
|
|
Fired = []byte("Fired!")
|
|
WorkHarder = []byte("Work Harder!")
|
|
|
|
ready = zmq4.NewMsgFrom([]byte(""), []byte("ready"))
|
|
)
|
|
|
|
func main() {
|
|
rand.Seed(1234)
|
|
bkg := context.Background()
|
|
router := zmq4.NewCRouter(bkg, zmq4.CWithID(zmq4.SocketIdentity("router")))
|
|
|
|
err := router.Listen("tcp://*:5671")
|
|
if err != nil {
|
|
log.Fatalf("could not listen %q: %v", endpoint, err)
|
|
}
|
|
defer router.Close()
|
|
|
|
var wg sync.WaitGroup
|
|
wg.Add(NWORKERS)
|
|
for i := 0; i < NWORKERS; i++ {
|
|
go worker(i, &wg)
|
|
}
|
|
|
|
nfired := 0
|
|
for {
|
|
msg, err := router.Recv()
|
|
if err != nil {
|
|
log.Fatalf("router failed to recv message: %v", err)
|
|
}
|
|
|
|
id := msg.Frames[0]
|
|
fire := rand.Float64() * 100
|
|
switch {
|
|
case fire < 30:
|
|
msg = zmq4.NewMsgFrom(id, []byte(""), Fired)
|
|
nfired++
|
|
default:
|
|
msg = zmq4.NewMsgFrom(id, []byte(""), WorkHarder)
|
|
}
|
|
err = router.Send(msg)
|
|
if err != nil {
|
|
log.Fatalf("router failed to send message to %q: %v", id, err)
|
|
}
|
|
if nfired == NWORKERS {
|
|
break
|
|
}
|
|
}
|
|
wg.Wait()
|
|
log.Printf("fired everybody.")
|
|
}
|
|
|
|
func worker(i int, wg *sync.WaitGroup) {
|
|
id := zmq4.SocketIdentity(fmt.Sprintf("dealer-%d", i))
|
|
dealer := zmq4.NewDealer(context.Background(), zmq4.WithID(id))
|
|
defer dealer.Close()
|
|
defer wg.Done()
|
|
|
|
err := dealer.Dial(endpoint)
|
|
if err != nil {
|
|
log.Fatalf("dealer %d failed to dial: %v", i, err)
|
|
}
|
|
|
|
total := 0
|
|
dloop:
|
|
for {
|
|
// ready to work
|
|
err = dealer.Send(ready)
|
|
if err != nil {
|
|
log.Fatalf("dealer %d failed to send ready message: %v", i, err)
|
|
}
|
|
|
|
// get workload from broker
|
|
msg, err := dealer.Recv()
|
|
if err != nil {
|
|
log.Fatalf("dealer %d failed to recv message: %v", i, err)
|
|
}
|
|
work := msg.Frames[1]
|
|
if bytes.Equal(work, Fired) {
|
|
break dloop
|
|
}
|
|
|
|
// do some random work
|
|
time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond)
|
|
total++
|
|
}
|
|
|
|
log.Printf("dealer %d completed %d tasks", i, total)
|
|
}
|