Пакет контекста против готового канала, чтобы избежать утечки памяти - PullRequest
0 голосов
/ 24 января 2019

Существует два разных подхода к очистке горутина.

  1. Используйте канал уничтожения, чтобы сообщить об отмене, и канал готово, чтобы указать, что выполнение программы было прекращено.

    type Worker struct {
      Done chan struct{}
      Kill chan struct{}
      Jobs chan Job
    }
    
    func (w *Worker) Run() {
      defer func() {
        w.Done <- struct{}{}
      }
      for {
        select {
        case <-w.Kill:
          return
        case j := <-w.Jobs:
          // Do some work
      }
    }
    
    go w.Run()
    w.Kill <- struct{}{}
    
  2. Используйте context для отмены

    type Worker struct {
      Ctx context.Context
      Cancel context.CancelFunc
      Jobs chan Job
    }
    
    func (w *Worker) Run() {
      for {
        select {
        case <-w.Ctx.Done():
          return
        case j := <-w.Jobs:
          // Do some work
      }
    }
    
    go w.Run()
    w.Cancel()
    

Каковы плюсы / минусы каждого подхода? Какой из них я должен по умолчанию?

Я понимаю, что если я хочу убить дерево взаимосвязанных подпрограмм, я должен использовать контекстный подход, но давайте просто скажем, что у меня есть простой рабочий, который не запускает другие подпрограммы внутренне.

1 Ответ

0 голосов
/ 24 января 2019

Go 1.7 Замечания к выпуску

Контекст

Go 1.7 перемещает пакет golang.org/x/net/context в стандарт библиотека как контекст. Это позволяет использовать контексты для отмены, тайм-ауты и передача данных в области запроса в другую стандартную библиотеку пакеты, включая net, net / http и os / exec, как указано ниже.

Для получения дополнительной информации о контекстах см. Пакет . документация и сообщение в блоге Go « Шаблоны Go Concurrent: Контекст


Были проблемы. Пакет контекста был введен для их решения.

Теперь, когда вы прочитали всю соответствующую документацию, по какому вопросу вы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...