tpool
-
НАЗВАНИЕ
- tpool — Часть расширения Tcl для потоков, реализующая пулы рабочих потоков.
- СИНТАКСИС
- ОПИСАНИЕ
- КОМАНДЫ
-
tpool::create ?options?
-
-minworkers number
- -maxworkers number
- -idletime seconds
- -initcmd script
- -exitcmd script
- -maxworkers number
-
-minworkers number
- tpool::names
- tpool::post ?-detached? ?-nowait? tpool script
- tpool::wait tpool joblist ?varname?
- tpool::cancel tpool joblist ?varname?
- tpool::get tpool job
- tpool::preserve tpool
- tpool::release tpool
- tpool::suspend tpool
- tpool::resume tpool
Имя
tpool — Часть расширения Tcl для потоков, реализующая пулы рабочих потоков.Синтаксис
package require Tcl 8 .4package require Thread ?2 .8?
tpool::create ?options?
tpool::names
tpool::post ?-detached? ?-nowait? tpoolscript
tpool::waittpooljoblist ?varname?
tpool::canceltpooljoblist ?varname?
tpool::gettpooljob
tpool::preservetpool
tpool::releasetpool
tpool::suspendtpool
tpool::resumetpool
Описание
Этот пакет создаёт и управляет пулами рабочих потоков. Он позволяет отправлять задания рабочим потокам и ожидать их завершения. Реализация threadpool учитывает цикл обработки событий Tcl. Это означает, что всякий раз, когда вызывающий поток вынужден ждать события (завершения задания или простоя/инициализации рабочего потока), реализация переходит в цикл обработки событий и позволяет обслуживать другие ожидающие события файлов или таймеров (или любые другие поддерживаемые события).Команды
- tpool::create ?options?
- Эта команда создает новый пул потоков. Она принимает несколько параметров в виде пар ключ-значение. Параметры используются для настройки параметров пула потоков. Команда возвращает идентификатор созданного пула потоков.
Поддерживаются следующие параметры:
- -minworkers number
- Минимальное количество рабочих потоков, необходимых для этого экземпляра пула потоков. Во время создания пула потоков реализация создаст указанное количество рабочих потоков и сохранит их как минимум до конца существования экземпляра пула потоков. Значение по умолчанию для этого параметра равно 0 (ноль), что означает, что новый пул потоков изначально не будет иметь рабочих потоков. Все рабочие потоки будут запускаться по мере необходимости вызывающими потоками, выполняющими команду tpool::post и помещающими задачи в очередь задач.
- -maxworkers number
- Максимальное количество рабочих потоков, разрешенных для этого экземпляра пула потоков. Если есть новая задача в очереди и нет доступных рабочих потоков, реализация попытается создать новый рабочий поток. Если количество доступных рабочих потоков меньше заданного значения, новый рабочий поток будет запущен. Вызывающий поток автоматически войдет в цикл обработки событий и будет ждать, пока рабочий поток не будет инициализирован. Однако, если количество доступных рабочих потоков равно заданному значению, вызывающий поток войдет в цикл обработки событий и будет ждать, пока первый рабочий поток не станет свободным, готовым к выполнению задачи. Значение по умолчанию для этого параметра равно 4 (четыре), что означает, что экземпляр пула потоков позволит максимум 4 рабочим потокам выполнять задачи или находиться в состоянии ожидания новых задач, помещенных в очередь задач.
- -idletime seconds
- Время в секундах, которое свободный рабочий поток ожидает получения задачи в очередь задач. Если за этот интервал времени задача не поступает, и время истекает, рабочий поток проверит количество доступных рабочих потоков и, если это количество больше, чем значение, установленное параметром minthreads, выйдет. Если определен exitscript, выходящий рабочий поток сначала выполнит скрипт, а затем выйдет. Ошибки из скрипта выхода, если таковые имеются, игнорируются.
Свободный рабочий поток не обслуживает цикл обработки событий. Однако, если вы поместите рабочий поток в цикл обработки событий, выполнив команду vwait или другие связанные команды Tcl, рабочий поток не будет в состоянии ожидания, поэтому таймер ожидания не будет учитываться. Значение по умолчанию для этого параметра не указано.
- -initcmd script
- Устанавливает скрипт Tcl, используемый для инициализации нового рабочего потока. Это обычно используется для загрузки пакетов и команд в рабочий поток, установки переменных по умолчанию, создания пространств имен и тому подобного. Если переданный скрипт завершается ошибкой Tcl, рабочий поток не будет создан, и инициирующая команда (либо tpool::create, либо tpool::post) выбросит ошибку. Значение по умолчанию для этого параметра не указано, следовательно, интерпретатор Tcl рабочего потока будет содержать только начальный набор команд Tcl.
- -exitcmd script
- Устанавливает скрипт Tcl, выполняемый при выходе свободного рабочего потока. Это обычно используется для очистки состояния рабочего потока, освобождения зарезервированных ресурсов, очистки памяти и т. д. Значение по умолчанию для этого параметра не указано, таким образом, при выходе рабочего потока не будет выполняться никакой скрипт Tcl.
- tpool::names
- Эта команда возвращает список идентификаторов пулов потоков, созданных с помощью команды tpool::create. Если пулы потоков не найдены, команда вернет пустой список.
- tpool::post ?-detached? ?-nowait? tpool script
- Эта команда отправляет скрипт в целевой пул потоков tpool для выполнения. Скрипт будет выполнен в первом доступном свободном рабочем потоке. Если доступных свободных рабочих потоков нет, команда создаст новый, войдёт в цикл обработки событий и обработает события до инициализации вновь созданного потока. Если текущее число рабочих потоков равно максимальному числу рабочих потоков, определённому при создании пула потоков, команда войдёт в цикл обработки событий и обработает события, ожидая, пока один из рабочих потоков не освободится. Если указан необязательный аргумент ?-nowait?, команда не будет ждать свободного рабочего потока. Она просто поместит задачу в очередь задач пула и немедленно вернётся.
Команда возвращает идентификатор размещённой задачи. Этот идентификатор используется для последующих команд tpool::wait, tpool::get и tpool::cancel для ожидания и получения результата размещённого скрипта или отмены размещённой задачи, соответственно. Если указан необязательный аргумент ?-detached?, команда разместит задачу как отделённую. Отделённая задача не может быть отменена или ожидания и не идентифицируется по идентификатору задачи.
Если пул потоков tpool не найден в списке активных пулов потоков, команда выбросит ошибку. Ошибка также будет сгенерирована, если вновь созданный рабочий поток не сможет инициализироваться.
- tpool::wait tpool joblist ?varname?
- Эта команда ожидает, пока одна или несколько задач, идентификаторы которых указаны в joblist, будут обработаны рабочим потоком(ами). Если ни одна из указанных задач не готова, команда войдёт в цикл обработки событий, обработает события и будет ждать, пока первая задача не станет готовой.
Команда возвращает список завершённых идентификаторов задач. Если указана необязательная переменная ?varname?, она будет установлена в список задач в joblist, которые всё ещё находятся в очереди. Если пул потоков tpool не найден в списке активных пулов потоков, команда выбросит ошибку.
- tpool::cancel tpool joblist ?varname?
- Эта команда отменяет ранее размещённые задачи, указанные в joblist, в пуле tpool. Отмена задачи успешна только для задачи, которая всё ещё ждёт обработки. Если задача уже выполняется одним из рабочих потоков, задача не будет отменена. Команда возвращает список отменённых идентификаторов задач. Если указана необязательная переменная ?varname?, она будет установлена в список задач в joblist, которые не были отменены. Если пул потоков tpool не найден в списке активных пулов потоков, команда выбросит ошибку.
- tpool::get tpool job
- Эта команда извлекает результат ранее размещённой задачи job. Получить результаты задач можно только для задач, по которым было выполнено ожидание с помощью команды tpool::wait. Если выполнение скрипта привело к ошибке, команда выбросит ошибку и обновит переменные errorInfo и errorCode соответственно. Если пул tpool не найден в списке пулов потоков, команда выбросит ошибку. Если задача job не готова к извлечению, потому что в настоящее время выполняется рабочим потоком, команда выбросит ошибку.
- tpool::preserve tpool
- Каждый вызов этой команды увеличивает счётчик ссылок на пул потоков tpool на единицу (1). Команда возвращает значение счётчика ссылок после увеличения. Увеличивая счётчик ссылок, вызывающий поток сигнализирует, что он хочет использовать ресурс в течение более длительного периода времени.
- tpool::release tpool
- Каждый вызов этой команды уменьшает счётчик ссылок на пул потоков tpool на единицу (1). Команда возвращает значение счётчика ссылок после уменьшения. Когда счётчик ссылок достигает нуля (0), пул потоков tpool помечается для завершения. Вы не должны ссылаться на пул потоков после того, как команда tpool::release вернёт ноль. Дескриптор tpool выходит из области видимости и больше не должен использоваться. Любая последующая ссылка на тот же дескриптор пула потоков приведёт к ошибке Tcl.
- tpool::suspend tpool
- Приостанавливает обработку работы в этой очереди. Все рабочие потоки пула приостановлены, но дополнительная работа может быть добавлена в пул. Обратите внимание, что добавление дополнительной работы не увеличит динамически количество рабочих потоков, так как обработка пула приостановлена. Количество рабочих потоков сохраняется на количестве, которое было до приостановки активности рабочих потоков. Если вам необходимо гарантировать определенное количество рабочих потоков, используйте параметр minworkers команды tpool::create.
- tpool::resume tpool
- Возобновляет обработку работы в этой очереди. Все приостановленные (подвешенные) рабочие потоки свободны для получения работы из пула. Обратите внимание, что возобновление работы пула просто позволит уже созданным рабочим потокам продолжить работу. Это не создаст дополнительных рабочих потоков для обработки задач, помещённых в очередь работы пула.
Обсуждение
Пул потоков — одна из наиболее распространённых парадигм многопоточности при разработке серверных приложений, обрабатывающих большое количество относительно небольших задач. Очень упрощённая модель для построения серверного приложения заключалась бы в создании нового потока каждый раз, когда приходит запрос, и обработке запроса в новом потоке. Одним из недостатков этого подхода является значительная нагрузка, связанная с созданием нового потока для каждого запроса; сервер, который создавал новый поток для каждого запроса, тратил бы больше времени и потреблял больше системных ресурсов на создание и уничтожение потоков, чем на обработку фактических пользовательских запросов. Кроме накладных расходов на создание и уничтожение потоков, активные потоки потребляют системные ресурсы. Создание слишком большого количества потоков может привести к тому, что система выйдет из строя или произойдёт зависание из-за чрезмерного потребления памяти.Пул потоков предлагает решение как проблемы накладных расходов на жизненный цикл потока, так и проблемы растраты ресурсов. За счёт повторного использования потоков для множества задач расходы на создание потоков распределяются по многим задачам. В качестве дополнительного преимущества, поскольку поток уже существует, когда приходит запрос, задержка, вызванная созданием потока, устраняется. Таким образом, запрос может быть обработан немедленно. Кроме того, правильно настроенное количество потоков в пуле потоков может также устранить растрату ресурсов, заставляя любой запрос ждать, пока не станет доступным поток для его обработки.
См. также
thread, tsv, ttrace
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ThreadCmd/tpool.htm