Ответы пользователя по тегу Go
  • Как привести тип < -chan amqp.Delivery к < -chan interface{}?

    Delgus
    @Delgus
    Кастовать каналы вроде как нельзя в go. Придется создавать промежуточный канал. Примерно так я это вижу. Но скорее всего оно не работает так как надо
    https://play.golang.org/p/i8-69C6RDrG
    package main
    
    import (
    	"fmt"
    	"github.com/streadway/amqp"
    )
    
    type (
    	IConsumer interface {
    		Consume() (<-chan interface{}, error)
    	}
    	AmqpConsumer struct {
    		conn    *amqp.Connection
    		topic   string
    		channel *amqp.Channel
    	}
    )
    
    func (pr *AmqpConsumer) Consume() (<-chan interface{}, error) {
    	var msgs <-chan interface{}
    
    	ch, err := pr.conn.Channel()
    	if err != nil {
    		return msgs, err
    	}
    	defer ch.Close()
    
    	amqp_msgs, err := ch.Consume(
    		pr.topic, // queue
    		"",       // consumer
    		true,     // auto-ack
    		false,    // exclusive
    		false,    // no-local
    		false,    // no-wait
    		nil,      // args
    	)
    	if err != nil {
    		return msgs, err
    	}
    
    	var castCh chan interface{}
    	go func() {
    		for msg := range amqp_msgs {
    			castCh <- msg
    		}
    	}()
    	
    	return castCh, nil
    }
    
    func main() {
    	fmt.Println("Hello, playground")
    }
    Ответ написан
  • Как обойти лимит 55 секунд (рвутся вебсокеты) на heroku с gorilla/websocket?

    Delgus
    @Delgus Автор вопроса
    Помог ответ здесь.
    https://stackoverflow.com/questions/37696527/go-go...
    Ответ написан
    Комментировать
  • Как правильно сделать простой многопоток в golang?

    Delgus
    @Delgus
    Я понимаю так - чтобы прекратить выполнение скрипта надо понять что все воркеры закончили работать. Собственно сам go это и делает когда бросает панику fatal error: all goroutines are asleep - deadlock! К сожалению эта паника возникает в рантайме и отловить ее невозможно. Единственный выход самим с определенной периодиочностью проверять стоят наши воркеры или работают. Самое простое решение добавить счетчик работающих горутин и проверять его и канал с задачами что он тоже пуст.

    https://play.golang.org/p/K3grU-mmkRb

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	// задачи
    	tasks := make(chan int, 2)
    	// канал для расчета количества работающих воркеров
    	working := make(chan int)
    	// канал для остановки скрипта
    	done := make(chan struct{})
    
    	for i := 0; i < 2; i++ {
    		go func(i int) {
    			for x := range tasks {
    				working <- 1
    				fmt.Println(i, x)
    				if x >= 5 {
    					tasks <- x - 1
    				}
    				working <- -1
    			}
    		}(i)
    	}
    
    	// счетчик работающих горутин
    	go func() {
    		ticker := time.NewTicker(time.Second)
    		// количество работающих воркеров
    		var count int
    
    		for {
    			select {
    			case w := <-working:
    				count += w
    			case <-ticker.C:
    				if count == 0 && len(tasks) == 0 {
    					close(done)
    				}
    			}
    		}
    	}()
    
    	tasks <- 1
    	tasks <- 3
    	tasks <- 2
    	tasks <- 5
    	tasks <- 3
    	tasks <- 9
    
    	<-done
    }
    Ответ написан
    Комментировать