Spec-Zone.ru › Nim 1

threadpool

Реализует spawn из Nim.

См. также:

  • модуль threads
  • модуль channels
  • модуль locks
  • модуль asyncdispatch

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

Импорты

cpuinfo, cpuload, locks, os

Типы

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

Константы

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

Процедуры

proc blockUntil(fv: var FlowVarBaseObj) {...}{.raises: [], tags: [].}

Ожидает, пока не придёт значение для fv.

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

Исходный код Редактировать
proc awaitAndThen[T](fv: FlowVar[T]; action: proc (x: T) {...}{.closure.})

Блокируется, пока fv не станет доступным, а затем передаёт его значение action.

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

Исходный код Редактировать
proc unsafeRead[T](fv: FlowVar[ref T]): ptr T
Блокируется, пока значение не станет доступным, и затем возвращает это значение. Исходный код Редактировать
proc `^`[T](fv: FlowVar[T]): T
Блокируется, пока значение не станет доступным, и затем возвращает это значение. Исходный код Редактировать
proc blockUntilAny(flowVars: openArray[FlowVarBase]): int {...}{.raises: [], tags: [].}

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

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

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

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

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

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

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

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

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

Исходный код Редактировать
proc spawn(call: sink typed): void {...}{.magic: "Spawn".}

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

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

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

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

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

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

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

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

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

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

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

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

Исходный код Редактировать

Шаблоны

template spawnX(call)

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

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

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

Исходный код Редактировать

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

Spec-Zone.ru

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