Модуль threads
Модуль threads предоставляет функции для выполнения кода в потоках
группы потоков — например, потоков приложения,
запущенных через box.cfg{app_threads = ...}.
Ниже приведен список функций модуля threads.
Имя | Назначение |
|---|---|
| Вызывает функцию в группе потоков. |
| Выполняет указанное выражение Lua в потоках заданной группы потоков. |
| Экспортирует локальную Lua-функцию, чтобы ее можно было вызвать с помощью |
| Возвращает информацию о настроенных группах потоков и текущем потоке (его идентификатор и имя группы). |
См. также подробный пример использования потоков приложения.
Параметры:
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, число элементов в массиве будет равно числу потоков в группе.
Если при выполнении функции на любом потоке возникает ошибка, это исключение повторно возбуждается.
Параметры:
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})
Параметры:
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)
Параметры:
Нет
Возвращает
table с информацией о настроенных группах потоков и текущем потоке.
Эта таблица содержит следующие поля:
group_name— имя группы, к которой принадлежит текущий потокthread_id— порядковый номер потока в его группеgroups— массив всех групп потоков. Каждый элемент здесь — это таблица с полямиnameиsize.
Пример
При следующей конфигурации:
threads:groups:- name: appsize: 2- name: shardingsize: 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: txthread_id: 1groups:- name: txsize: 1- name: appsize: 2- name: shardingsize: 4...