> For the complete documentation index, see [llms.txt](https://ru.gentee.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ru.gentee.org/syntax/multithreading.md).

# Многопоточность

Язык Gentee позволяет создавать многопоточные скрипты. В этом случае, часть скрипа может выполняться параллельно, что уменьшает время его работы. Чтобы выполнить какой-то код в отдельном потоке, необходимо указать его в конструкции **go**. Скрипт продолжит выполнять следующие конструкции не дожидаясь окончания работы кода внутри *go*, а сразу после того как новый поток будет запущен. Конструкция **go** возвращает идентификатор созданного потока, который можно присвоить переменной типа **thread** и использовать затем в функциях управления потоками. Если скрипт закончил свою работу раньше чем созданные потоки, то он будет ожидать окончания работы всех потоков. Если при выполнении многопоточного скрипта произошла ошибка в любом из потоков, то в этом случае, все потоки закрываются и скрипт возвращает эту ошибку.

```
GoStmt = "go" [ "(" GoArgs ")" ] Block
GoArgs = identifier ":" Expression { "," identifier ":" Expression }
```

```
func myThread {
  for i in 0..50 {
    Print(`x` )
    if i % 3 == 0 : sleep(5)
  }
}

run {
  thread th = go {
    for i in 0..100 {
      Print(` `, i )
      if i % 7 == 0 : sleep(5)
    }
  }
  suspend( th )
  go : myThread()
  resume(th)
  Print( `OK`)
  wait(th)
  Print( `END`)
}
```

Вы можете передавать любые параметры в команде **go**. Для этого необходимо указать имя параметра и, через двоеточие, его значение. Тип параметра определяется автоматически по переданному значению. Если вы передаете структуры или массивы, то параметру будет присвоена копия значения.

```
run str {
  str s = "ok"
  thread th1 = go (a: s + " test") : ctxPar #= a
  thread th2 = go (a: Max(1,23), b: Min(100,87)) {
     ctxSum #= a + b
  }
  wait(th2)
  wait(th1)
  return #ctxPar + #ctxSum
}
```
