Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 2 ноября 2026 г. в 15:35

Модуль threads

Обзор

Модуль threads предоставляет функции для выполнения кода в потоках группы потоков — например, потоков приложения, запущенных через box.cfg{app_threads = ...}.

Справочник по API

Ниже приведен список функций модуля threads.

Имя

Назначение

threads.call(group_name, func_name, args, opts)

Вызывает функцию в группе потоков.

threads.eval(group_name, expr, args, opts)

Выполняет указанное выражение Lua в потоках заданной группы потоков.

threads.export(func_name, func)

Экспортирует локальную Lua-функцию, чтобы ее можно было вызвать с помощью threads.call() из других потоков.

threads.info()

Возвращает информацию о настроенных группах потоков и текущем потоке (его идентификатор и имя группы).

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

threads.call(group_name, func_name, args, opts)

Параметры:

  • group_name (string) — имя группы потоков, например 'app' для потоков приложения.
  • func_name (string) — имя функции. Функция должна быть экспортирована (см. threads.export()).
  • args (table, необязательный) — массив значений, передаваемых в expr в виде vararg-аргументов Lua (...).
  • opts (table, необязательный) — параметры диспетчеризации, включая target — поток(и) в группе, на котором нужно выполнить expr.

В настоящее время единственным доступным параметром для функций call() и eval() является target, который должен быть равен all, any или порядковому номеру потока в группе (нумерация с 1). Он определяет набор потоков, на которых будет вызвана функция:

  • если задано значение all, функция будет вызвана на всех потоках (значение по умолчанию);
  • если задано значение any, функция будет вызвана на случайно выбранном потоке;
  • если задано числовое значение, функция будет вызвана на потоке с указанным порядковым номером в группе.

Возвращает

table — массив результатов, по одному на каждый целевой поток.

В случае успеха функции call() и eval() возвращают массив результатов, по одному для каждого потока, на котором был выполнен код:

  • Если код был выполнен на одном потоке (целью было значение any или число), массив будет содержать ровно один элемент.
  • Если целью было значение all, число элементов в массиве будет равно числу потоков в группе.

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

threads.eval(group_name, expr, args, opts)

Параметры:

  • group_name (string) — имя группы потоков, например 'app' для потоков приложения.
  • expr (string) — выражение Lua (исходный код) для выполнения на целевом потоке (потоках). Внутри выражения ... ссылается на значения, переданные в args.
  • args (table, необязательный) — массив значений, передаваемых в expr в виде vararg-аргументов Lua (...).
  • opts (table, необязательный) — параметры диспетчеризации, включая target — поток(и) в группе, на котором нужно выполнить expr.

Подробнее о параметре opts см. в описании threads.call() выше.

Возвращает

table — массив результатов, по одному на каждый целевой поток. Подробнее о возвращаемых значениях см. в описании threads.call() выше.

Если выполнение expr завершается ошибкой на любом из целевых потоков, повторно возбуждается ошибка от последнего завершившегося с ошибкой потока.

Пример:

box.cfg{app_threads = 1}box.schema.space.create('test')box.space.test:create_index('primary')box.space.test:replace({1, 'x'})local rv = box.read_view.open({name = 'shared_read_view'})local threads = require('threads')threads.eval('app', [[  local rv = box.read_view.open({id = ...})  return rv.space.test:select()]], {rv.id})

threads.export(func_name, func)

Параметры:

  • func_name (string) — имя локальной функции, которое будет использоваться для вызова этой функции из threads.call().
  • func (string) — реализация локальной функции.

Возвращает

Ничего

Пример:

local threads = require('threads')box.iproto.export('test_func', function()    local info = threads.info()    return string.format('Hello from thread %s/%d',                         info.group_name, info.thread_id)end)

threads.info()

Параметры:

Нет

Возвращает

table с информацией о настроенных группах потоков и текущем потоке. Эта таблица содержит следующие поля:

  • group_name — имя группы, к которой принадлежит текущий поток
  • thread_id — порядковый номер потока в его группе
  • groups — массив всех групп потоков. Каждый элемент здесь — это таблица с полями name и size.

Пример

При следующей конфигурации:

threads:  groups:    - name: app      size: 2    - name: sharding      size: 4groups:  group-001:    replicasets:      replicaset-001:        instances:          instance-001: {}

Запустим tarantool в интерактивном режиме:

tarantool -n instance-001 -c config.yaml -i

Вот что возвращает threads.info() в основном потоке:

tarantool> threads = require('threads')---...tarantool> threads.info()---- group_name: tx  thread_id: 1  groups:  - name: tx    size: 1  - name: app    size: 2  - name: sharding    size: 4...