Не программируйте интерфейсы, открывайте их.
максимальный размер стека составляет 1 Гбайт для 64-разрядных и 250 Мбайт для 32-разрядных систем
Более того, context.Context экспортирует метод Err, возвращающий nil, если канал Done еще не закрыт. В противном случае возвращается ненулевая ошибка, объясняющая, почему канал Done был закрыт. Например:
• ошибка context.Canceled, если канал отменен;
• ошибка context.DeadlineExceeded, если крайний срок действия контекста прошел.
Тип context.Context экспортирует метод Done, который возвращает односторонний канал уведомления (то есть он может только получать): <-chan struct{}. Этот канал закрывается, когда работа, связанная с контекстом, должна быть отменена. Например:
• Канал Done, связанный с контекстом, созданным с помощью context.WithCancel, закрывается при вызове функции cancel.
• Канал Done, связанный с контекстом, созданным с помощью context.WithDeadline, закрывается по истечении крайнего срока.
В чем смысл вызова функции cancel как функции defer? Внутри себя context.WithTimeout создает горутину, которая будет храниться в памяти в течение 4 секунд или до тех пор, пока не будет вызвана cancel. Следовательно, вызов cancel в качестве функции defer означает, что при выходе из родительской функции контекст будет отменен, а созданная горутина остановлена. Это мера предосторожности, чтобы при возвращении мы не оставили в памяти сохраненные объекты.
Теперь перейдем ко второму аспекту контекстов Go — сигналам отмены (cancellation signals).
В чем смысл вызова функции cancel как функции defer? Внутри себя context.WithTimeout создает горутину, которая будет храниться в памяти в течение 4 секунд или до тех пор, пока не будет вызвана cancel.
Мы можем использовать функцию runtime.GOMAXPROCS (int) для обновления значения GOMAXPROCS. Вызов с 0 в качестве аргумента не меняет, а просто возвращает текущее значение:
n := runtime.GOMAXPROCS(0)
Если рабочая нагрузка — типа I/O-bound, то ответ зависит от внешней системы. С каким количеством конкурентных обращений сможет справиться система, если мы хотим максимизировать ее пропускную способность?
Если рабочая нагрузка — типа CPU-bound, то рекомендуется полагаться на GOMAXPROCS — переменную, которая устанавливает количество потоков ОС, выделенных для выполнения горутин. По умолчанию это значение равно количеству логических процессоров.
Конкурентность — это о работе с большим количеством вещей одновременно. Параллелизм — это о выполнении множества дел одновременно.
Роб Пайк (Rob Pike)
следует отметить в отношении параметров типа: они не могут использоваться с аргументами метода, а только с аргументами функции или получателями методов.