Spec-Zone.ru › Nim

std/tasks

Source Edit

Этот модуль предоставляет базовые примитивы для создания параллельных программ. Task должен принадлежать только одному потоку, он не может быть общим для потоков.

Пример:

import std/tasks
block:
  var num = 0
  proc hello(a: int) = inc num, a

  let b = toTask hello(13)
  b.invoke()
  assert num == 13
  # A task can be invoked multiple times
  b.invoke()
  assert num == 26

block:
  type
    Runnable = ref object
      data: int

  var data: int
  proc hello(a: Runnable) {.nimcall.} =
    a.data += 2
    data = a.data


  when false:
    # the parameters of call must be isolated.
    let x = Runnable(data: 12)
    let b = toTask hello(x) # error ----> expression cannot be isolated: x
    b.invoke()

  let b = toTask(hello(Runnable(data: 12)))
  b.invoke()
  assert data == 14
  b.invoke()
  assert data == 16

Импорты

macros, isolation, typetraits, effecttraits

Типы

Task = object
Task содержит обратный вызов и его аргументы. Source Edit

Процедуры

proc `=copy`(x: var Task; y: Task) {.error.}
Source Edit
proc `=destroy`(t: Task) {.inline, ...gcsafe, raises: [], tags: [RootEffect],
                           forbids: [].}
Освобождает ресурсы, выделенные для Task. Source Edit
proc invoke(task: Task; res: pointer = nil) {.inline, ...gcsafe,
    raises: [Exception], tags: [RootEffect], forbids: [].}
Вызывает task. Source Edit

Макросы

macro toTask(e: typed{nkCall | nkInfix | nkPrefix | nkPostfix | nkCommand |
    nkCallStrLit}): Task
Преобразует вызов и его аргументы в Task.

Пример:

proc hello(a: int) = echo a

let b = toTask hello(13)
assert b is Task
Source Edit

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

Spec-Zone.ru

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