Jelajahi Sumber

Make publishing asynchronous

Philipp Heckel 4 tahun lalu
induk
melakukan
c0ee174b13
1 mengubah file dengan 13 tambahan dan 7 penghapusan
  1. 13 7
      server/topic.go

+ 13 - 7
server/topic.go

@@ -28,6 +28,7 @@ func newTopic(id string, last time.Time) *topic {
 	}
 	}
 }
 }
 
 
+// Subscribe subscribes to this topic
 func (t *topic) Subscribe(s subscriber) int {
 func (t *topic) Subscribe(s subscriber) int {
 	t.mu.Lock()
 	t.mu.Lock()
 	defer t.mu.Unlock()
 	defer t.mu.Unlock()
@@ -37,24 +38,29 @@ func (t *topic) Subscribe(s subscriber) int {
 	return subscriberID
 	return subscriberID
 }
 }
 
 
+// Unsubscribe removes the subscription from the list of subscribers
 func (t *topic) Unsubscribe(id int) {
 func (t *topic) Unsubscribe(id int) {
 	t.mu.Lock()
 	t.mu.Lock()
 	defer t.mu.Unlock()
 	defer t.mu.Unlock()
 	delete(t.subscribers, id)
 	delete(t.subscribers, id)
 }
 }
 
 
+// Publish asynchronously publishes to all subscribers
 func (t *topic) Publish(m *message) error {
 func (t *topic) Publish(m *message) error {
-	t.mu.Lock()
-	defer t.mu.Unlock()
-	t.last = time.Now()
-	for _, s := range t.subscribers {
-		if err := s(m); err != nil {
-			log.Printf("error publishing message to subscriber")
+	go func() {
+		t.mu.Lock()
+		defer t.mu.Unlock()
+		t.last = time.Now()
+		for _, s := range t.subscribers {
+			if err := s(m); err != nil {
+				log.Printf("error publishing message to subscriber")
+			}
 		}
 		}
-	}
+	}()
 	return nil
 	return nil
 }
 }
 
 
+// Subscribers returns the number of subscribers to this topic
 func (t *topic) Subscribers() int {
 func (t *topic) Subscribers() int {
 	t.mu.Lock()
 	t.mu.Lock()
 	defer t.mu.Unlock()
 	defer t.mu.Unlock()