threadpool
Реализует spawn из Nim.
См. также:
Нестабильный 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