Можете ли вы определить, сколько потоков создаст определенное количество подпрограмм? - PullRequest
8 голосов
/ 11 ноября 2009

Я понимаю, что подпрограммы мультиплексируются в несколько потоков ОС, поэтому, если один из них блокируется, например, во время ожидания ввода-вывода, другие продолжают работать. Но есть ли способ узнать заранее, сколько потоков я бы создал, если бы мне пришлось создавать n подпрограмм?

Например, если мы вызовем функцию ниже, мы узнаем, сколько (или максимальное количество) системных потоков будет создано для n процедур:

type Vector []float64

// Apply the operation to n elements of v starting at i.
func (v Vector) DoSome(i, n int, u Vector, c chan int) {
    for ; i < n; i++ {
        v[i] += u.Op(v[i])
    }
    c <- 1;    // signal that this piece is done
}

Ответы [ 3 ]

7 голосов
/ 13 ноября 2009

Согласно PDF-слайдам Pike's Go Course (День 3):

... если вы хотите параллелизма на уровне пользователя, вы должны установить $GOMAXPROCS или вызвать runtime.GOMAXPROCS(n). GOMAXPROCS сообщает планировщику времени выполнения, сколько не заблокированных системных вызовов для одновременного запуска.

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

Это сообщение в блоге , по-видимому, подразумевает, что если вы не установите переменную среды, среда выполнения будет использовать только одно ядро ​​(предположительно потому, что оно использует только один процесс.)

7 голосов
/ 25 мая 2012

Каждая процедура может использовать максимум одну нить за раз. Использует ли он поток или нет, зависит от того, что он делает. Значение GOMAXPROCS определяет количество потоков, которые можно использовать при свободном запуске кода Go - иными словами, максимальный уровень параллелизма.

Однако можно использовать большее количество потоков, даже если GOMAXPROCS = 1, когда подпрограммы блокируются непосредственно при системных вызовах или вызовах в C.

Следующие операции не заставляют программу использовать поток, когда они блокируют:

  • операции с каналами
  • сетевые операции
  • спящий
  • все примитивы в пакете sync

Это означает, например, что если у вас есть много подпрограмм, которые открывают / dev / ttyxx и блокируют чтение, вы будете использовать поток для каждого из них. То же самое происходит, если вы выполняете загрузку процессов и ожидаете их завершения.

3 голосов
/ 11 ноября 2009

В настоящее время gccgo создаст один поток для каждой процедуры.

Не знаю насчет 6г.

...