1//
2//  Multithreaded Hello World server.
3//
4
5package main
6
7import (
8	zmq "github.com/pebbe/zmq4"
9
10	"fmt"
11	"log"
12	"time"
13)
14
15func worker_routine() {
16	//  Socket to talk to dispatcher
17	receiver, _ := zmq.NewSocket(zmq.REP)
18	defer receiver.Close()
19	receiver.Connect("inproc://workers")
20
21	for {
22		msg, e := receiver.Recv(0)
23		if e != nil {
24			break
25		}
26		fmt.Println("Received request: [" + msg + "]")
27
28		//  Do some 'work'
29		time.Sleep(time.Second)
30
31		//  Send reply back to client
32		receiver.Send("World", 0)
33	}
34}
35
36func main() {
37	//  Socket to talk to clients
38	clients, _ := zmq.NewSocket(zmq.ROUTER)
39	defer clients.Close()
40	clients.Bind("tcp://*:5555")
41
42	//  Socket to talk to workers
43	workers, _ := zmq.NewSocket(zmq.DEALER)
44	defer workers.Close()
45	workers.Bind("inproc://workers")
46
47	//  Launch pool of worker goroutines
48	for thread_nbr := 0; thread_nbr < 5; thread_nbr++ {
49		go worker_routine()
50	}
51	//  Connect work threads to client threads via a queue proxy
52	err := zmq.Proxy(clients, workers, nil)
53	log.Fatalln("Proxy interrupted:", err)
54}
55