std/threadpool
Исходный кодРедактироватьРеализует параллельные и 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