Лучший способ передать context.Context к замыканию, выполненному в отдельной программе - PullRequest
0 голосов
/ 04 марта 2019

Какой лучший способ передать context.Context закрытию, которое будет выполнено в отдельной процедуре?

Поскольку я не изменяю context.Context внутри замыкания, я предполагаю, что оба варианта действительны.Второй вариант может сэкономить мне немного памяти, не копируя интерфейс.

1) передать в качестве аргумента

func run(ctx context.Context) {
  for i := 0; i <= 5; i++ {
    go func(id int, ictx context.Context) {
      for {
        select {
          case <- ictx.Done():
            return
          default:
            // do something
        }
      }
    }(i, ctx)
  }
}

2) открыть переменную внешнего контекста

func run(ctx context.Context) {
  for i := 0; i <= 5; i++ {
    go func(id int) {
      for {
        select {
          case <- ctx.Done():
            return
          default:
            // do something
        }
      }
    }(i)
  }
}

1 Ответ

0 голосов
/ 04 марта 2019

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

Короче говоря,ничего особенного не нужно, так что # 2 просто отлично.Поскольку # 1 на самом деле не выполняет замыкание, он идеален в ситуациях, когда вы хотите выполнить именованную функцию, которая принимает аргумент контекста


Примечание по терминологии: Ваш оригиналвопрос (который я отредактировал для ясности) задал вопрос о выполнении «горутина в закрытии».Технически говоря, это бессмысленно.Но это общая путаница.Goroutines - легкие нити исполнения.Функции - это кусочки кода.Это не одно и то же, поэтому ссылаться на функции или замыкания как на подпрограммы на самом деле не имеет смысла.См. этот ответ для более подробной информации.

...