Spec-Zone.ru › Nim

std/threadpool

Исходный кодРедактировать
Устаревшее: используйте пакеты nimble `malebolgia`, `taskpools` или `weave` вместо этого

Реализует параллельные и spawn-выражения Nim.

Нестабильный API.

См. также

  • модуль потоков для базовой поддержки потоков
  • модуль блокировок для блокировок и условных переменных
  • модуль asyncdispatch для асинхронного ввода-вывода

Импорты

cpuinfo, cpuload, locks, os

Типы

FlowVar[T] {.compilerproc.} = ref FlowVarObj[T]
Переменная потока данных. Исходный код Редактировать
FlowVarBase = ref FlowVarBaseObj
Нетипизированный базовый класс для FlowVar[T]. Исходный код Редактировать
ThreadId = range[0 .. MaxDistinguishedThread - 1]
Идентификатор потока. Исходный код Редактировать

Константы

MaxDistinguishedThread {.intdefine.} = 32
Максимальное количество "выделенных" потоков. Исходный код Редактировать
MaxThreadPoolSize {.intdefine.} = 256
Максимальный размер пула потоков. 256 потоков должно хватить всем ;-) Исходный код Редактировать

Процедуры

proc `^`[T](fv: FlowVar[T]): T
Ожидает, пока значение станет доступным, а затем возвращает это значение. Исходный код Редактировать
proc awaitAndThen[T](fv: FlowVar[T]; action: proc (x: T) {.closure.})

Ожидает, пока fv станет доступным, а затем передает его значение в action.

Обратите внимание, что из-за семантики передачи параметров в Nim, это означает, что T не нужно копировать, поэтому awaitAndThen может быть иногда более эффективным, чем ^ proc.

Исходный код Редактировать
proc blockUntil(fv: var FlowVarBaseObj) {....raises: [], tags: [], forbids: [].}

Ожидает, пока значение для fv не станет доступным.

Обычно вызывать это явно не нужно.

Исходный код Редактировать
proc blockUntilAny(flowVars: openArray[FlowVarBase]): int {....raises: [],
    tags: [], forbids: [].}

Ожидает любого из указанных flowVars. Возвращает индекс одного flowVar для которого пришло значение.

Один flowVar поддерживает только одно одновременное обращение к blockUntilAny. Это означает, что если вы blockUntilAny([a,b]) и blockUntilAny([b,c]) , второй вызов будет блокировать только до тех пор, пока c. Если не осталось flowVar для ожидания, возвращается -1.

Примечание: Это приводит к недетерминированному поведению и следует избегать.

Исходный код Редактировать
proc isReady(fv: FlowVarBase): bool {....raises: [], tags: [], forbids: [].}

Определяет, доступно ли значение указанного FlowVarBase.

Если true, ожидание fv не будет блокировать.

Исходный код Редактировать
proc parallel(body: untyped) {.magic: "Parallel", ...raises: [], tags: [],
                               forbids: [].}

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

body должен быть в DSL, который является особым подмножеством языка.

Для получения дополнительной информации, обратитесь к руководству.

Исходный код Редактировать
proc pinnedSpawn(id: ThreadId; call: sink typed) {.magic: "Spawn", ...raises: [],
    tags: [], forbids: [].}

Всегда запускает новую задачу в потоке рабочего потока с id, таким образом call всегда выполняется в потоке.

call должен быть вызовом функции p(...) где p является gcsafe и имеет тип возвращаемого значения, который является либо void или совместим с FlowVar[T].

Исходный код Редактировать
proc preferSpawn(): bool {....raises: [], tags: [], forbids: [].}

Используйте эту функцию, чтобы быстро определить, предпочтительнее ли использование spawn или прямой вызов.

Если она возвращает true, использование spawn может быть оправдано. В общем случае, нет необходимости вызывать ее напрямую; используйте шаблон spawnX вместо этого.

Исходный код Редактировать
proc setMaxPoolSize(size: range[1 .. MaxThreadPoolSize]) {....raises: [], tags: [],
    forbids: [].}
Устанавливает максимальный размер пула потоков. Значение по умолчанию - MaxThreadPoolSize. Исходный код Редактировать
proc setMinPoolSize(size: range[1 .. MaxThreadPoolSize]) {....raises: [], tags: [],
    forbids: [].}
Устанавливает минимальный размер пула потоков. Значение по умолчанию - 4. Исходный код Изменить
proc spawn(call: sink typed) {.magic: "Spawn", ...raises: [], tags: [], forbids: [].}

Всегда создаёт новую задачу, чтобы call не выполнялась в потоке вызова.

call должна быть вызовом процедуры p(...), где p является gcsafe и имеет тип возвращаемого значения, который является либо void, либо совместим с FlowVar[T].

Исходный код Изменить
proc sync() {....raises: [], tags: [TimeEffect], forbids: [].}

Простая блокировка ожидания всех spawn задач.

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

Исходный код Изменить
proc unsafeRead[T](fv: FlowVar[ref T]): ptr T
Блокируется до тех пор, пока значение не станет доступным, а затем возвращает это значение. Исходный код Изменить

Шаблоны

template spawnX(call)

Создаёт новую задачу, если доступен процессорный ядро, в противном случае выполняет вызов в потоке вызова.

Обычно рекомендуется использовать процедуру spawn, чтобы не заблокировать производителя на неопределённое время.

call должна быть вызовом процедуры p(...), где p является gcsafe и имеет тип возвращаемого значения, который является либо 'void', либо совместим с FlowVar[T].

Исходный код Изменить

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/threadpool.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API