Files
godot-docs-l10n/classes/uk/class_workerthreadpool.rst

249 lines
21 KiB
ReStructuredText
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

:github_url: hide
.. _class_WorkerThreadPool:
WorkerThreadPool
================
**Успадковує:** :ref:`Object<class_Object>`
Однотон, який виділяє деякі :ref:`Thread<class_Thread>` на старті, використовується для виконання завдань на ці нитки.
.. rst-class:: classref-introduction-group
Опис
--------
Синглтон **WorkerThreadPool** виділяє набір :ref:`Thread<class_Thread>` (так званих робочих потоків) під час запуску проекту та надає методи для розвантаження завдань на них. Це можна використовувати для простих багатопотоковість без необхідності створення :ref:`Thread<class_Thread>`.
Завдання містять :ref:`Callable<class_Callable>` для виконання потоками. **WorkerThreadPool** можна використовувати для створення звичайних завдань, які буде виконано одним робочим потоком або груповими завданнями, які можна розподілити між кількома робочими потоками. Групові завдання виконують :ref:`Callable<class_Callable>` кілька разів, що робить їх корисними для ітерації по багатьох елементах, таких як вороги на арені.
Ось приклад того, як перенести ресурсоємну функцію на робочі потоки:
.. tabs::
.. code-tab:: gdscript
var enemies = [] # Масив, який буде заповнено ворогами.
func process_enemy_ai(enemy_index):
var processed_enemy = enemies[enemy_index]
# Дорога логіка...
func _process(delta):
var task_id = WorkerThreadPool.add_group_task(process_enemy_ai, enemies.size())
# Інший код...
WorkerThreadPool.wait_for_group_task_completion(task_id)
# Інший код, який залежить від ворожого ШІ, що вже обробляється.
.. code-tab:: csharp
private List<Node> _enemies = new List<Node>(); // A list to be filled with enemies.
private void ProcessEnemyAI(int enemyIndex)
{
Node processedEnemy = _enemies[enemyIndex];
// Дорога логіка тут.
}
public override void _Process(double delta)
{
long taskId = WorkerThreadPool.AddGroupTask(Callable.From<int>(ProcessEnemyAI), _enemies.Count);
// Інший код...
WorkerThreadPool.WaitForGroupTaskCompletion(taskId);
// Інший код, який залежить від ворожого ШІ, що вже обробляється.
}
Наведений вище код залежить від того, чи кількість елементів у масиві ``enemies`` залишається постійною протягом багатопотокової частини.
\ **Примітка:** Використання цього синглтона може негативно вплинути на продуктивність, якщо завдання, що розподіляється між потоками, не є обчислювально ресурсоємним.
.. rst-class:: classref-introduction-group
Посібники
------------------
- :doc:`Використання кількох потоків <../tutorials/performance/using_multiple_threads>`
- :doc:`Нитка-безпечні API <../tutorials/performance/thread_safe_apis>`
.. rst-class:: classref-reftable-group
Методи
------------
.. table::
:widths: auto
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`add_group_task<class_WorkerThreadPool_method_add_group_task>`\ (\ action\: :ref:`Callable<class_Callable>`, elements\: :ref:`int<class_int>`, tasks_needed\: :ref:`int<class_int>` = -1, high_priority\: :ref:`bool<class_bool>` = false, description\: :ref:`String<class_String>` = ""\ ) |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`add_task<class_WorkerThreadPool_method_add_task>`\ (\ action\: :ref:`Callable<class_Callable>`, high_priority\: :ref:`bool<class_bool>` = false, description\: :ref:`String<class_String>` = ""\ ) |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`get_caller_group_id<class_WorkerThreadPool_method_get_caller_group_id>`\ (\ ) |const| |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`get_caller_task_id<class_WorkerThreadPool_method_get_caller_task_id>`\ (\ ) |const| |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`get_group_processed_element_count<class_WorkerThreadPool_method_get_group_processed_element_count>`\ (\ group_id\: :ref:`int<class_int>`\ ) |const| |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`bool<class_bool>` | :ref:`is_group_task_completed<class_WorkerThreadPool_method_is_group_task_completed>`\ (\ group_id\: :ref:`int<class_int>`\ ) |const| |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`bool<class_bool>` | :ref:`is_task_completed<class_WorkerThreadPool_method_is_task_completed>`\ (\ task_id\: :ref:`int<class_int>`\ ) |const| |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| |void| | :ref:`wait_for_group_task_completion<class_WorkerThreadPool_method_wait_for_group_task_completion>`\ (\ group_id\: :ref:`int<class_int>`\ ) |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`Error<enum_@GlobalScope_Error>` | :ref:`wait_for_task_completion<class_WorkerThreadPool_method_wait_for_task_completion>`\ (\ task_id\: :ref:`int<class_int>`\ ) |
+---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
.. rst-class:: classref-section-separator
----
.. rst-class:: classref-descriptions-group
Описи методів
--------------------------
.. _class_WorkerThreadPool_method_add_group_task:
.. rst-class:: classref-method
:ref:`int<class_int>` **add_group_task**\ (\ action\: :ref:`Callable<class_Callable>`, elements\: :ref:`int<class_int>`, tasks_needed\: :ref:`int<class_int>` = -1, high_priority\: :ref:`bool<class_bool>` = false, description\: :ref:`String<class_String>` = ""\ ) :ref:`🔗<class_WorkerThreadPool_method_add_group_task>`
Додає ``action`` як групове завдання, яке буде виконуватися робочими потоками. :ref:`Callable<class_Callable>` буде викликано певну кількість разів залежно від ``elements``. Для кожного значення від ``0`` до ``element - 1`` включно буде створено потік, що передасть його як параметр.
Кількість потоків, між якими буде розподілено завдання, визначено ``tasks_needed``, де значення за замовчуванням ``-1`` означає, що воно розподіляється на всі робочі потоки. ``high_priority`` визначає, чи завдання має високий пріоритет, чи низький (за замовчуванням). Ви можете додатково надати ``description``, щоб допомогти з відлагодженням.
Повертає ідентифікатор групового завдання, який може використовуватися іншими методами.
\ **Попередження:** Кожне завдання повинно бути очікуване для завершення за допомогою :ref:`wait_for_task_completion()<class_WorkerThreadPool_method_wait_for_task_completion>` або :ref:`wait_for_group_task_completion()<class_WorkerThreadPool_method_wait_for_group_task_completion>` для звільнення всіх виділених у завданні ресурсів.
.. rst-class:: classref-item-separator
----
.. _class_WorkerThreadPool_method_add_task:
.. rst-class:: classref-method
:ref:`int<class_int>` **add_task**\ (\ action\: :ref:`Callable<class_Callable>`, high_priority\: :ref:`bool<class_bool>` = false, description\: :ref:`String<class_String>` = ""\ ) :ref:`🔗<class_WorkerThreadPool_method_add_task>`
Додає ``action`` як завдання, яке має виконати робочий потік. ``high_priority`` визначає, чи має завдання високий чи низький пріоритет (за замовчуванням). Ви можете додатково надати ``description`` для допомоги в налагодженні.
Повертає ідентифікатор завдання, який може використовуватися іншими методами.
\ **Попередження:** Кожне завдання має бути завершене за допомогою :ref:`wait_for_task_completion()<class_WorkerThreadPool_method_wait_for_task_completion>` або :ref:`wait_for_group_task_completion()<class_WorkerThreadPool_method_wait_for_group_task_completion>` у певний момент, щоб будь-які виділені ресурси всередині завдання можна було очистити.
.. rst-class:: classref-item-separator
----
.. _class_WorkerThreadPool_method_get_caller_group_id:
.. rst-class:: classref-method
:ref:`int<class_int>` **get_caller_group_id**\ (\ ) |const| :ref:`🔗<class_WorkerThreadPool_method_get_caller_group_id>`
Повертає ідентифікатор групи завдань поточного потоку, що викликає цей метод, або ``-1``, якщо значення недійсне або поточний потік не є частиною групи завдань.
.. rst-class:: classref-item-separator
----
.. _class_WorkerThreadPool_method_get_caller_task_id:
.. rst-class:: classref-method
:ref:`int<class_int>` **get_caller_task_id**\ (\ ) |const| :ref:`🔗<class_WorkerThreadPool_method_get_caller_task_id>`
Повертає ідентифікатор завдання поточного потоку, що викликає цей метод, або ``-1``, якщо завдання є груповим завданням, недійсним або поточний потік не є частиною пулу потоків (наприклад, головного потоку).
Може використовуватися завданням для отримання власного ідентифікатора завдання або для визначення, чи виконується поточний код у пулі робочих потоків.
\ **Примітка:** Групові завдання мають власні ідентифікатори, тому цей метод поверне ``-1`` для групових завдань.
.. rst-class:: classref-item-separator
----
.. _class_WorkerThreadPool_method_get_group_processed_element_count:
.. rst-class:: classref-method
:ref:`int<class_int>` **get_group_processed_element_count**\ (\ group_id\: :ref:`int<class_int>`\ ) |const| :ref:`🔗<class_WorkerThreadPool_method_get_group_processed_element_count>`
Повертає, скільки разів :ref:`Callable<class_Callable>` групового завдання з заданим ID вже було виконано робочими потоками.
\ **Примітка:** Якщо потік почався з виконання :ref:`Callable<class_Callable>` але ще не закінчився, то його не буде враховано.
.. rst-class:: classref-item-separator
----
.. _class_WorkerThreadPool_method_is_group_task_completed:
.. rst-class:: classref-method
:ref:`bool<class_bool>` **is_group_task_completed**\ (\ group_id\: :ref:`int<class_int>`\ ) |const| :ref:`🔗<class_WorkerThreadPool_method_is_group_task_completed>`
Повертає ``true``, якщо завершується групове завдання з даним ID.
\ **Примітка:** Ви повинні викликати цей метод між додаванням групового завдання і очікуванням його завершення.
.. rst-class:: classref-item-separator
----
.. _class_WorkerThreadPool_method_is_task_completed:
.. rst-class:: classref-method
:ref:`bool<class_bool>` **is_task_completed**\ (\ task_id\: :ref:`int<class_int>`\ ) |const| :ref:`🔗<class_WorkerThreadPool_method_is_task_completed>`
Повертаємо ``true``, якщо поставлено завдання з даним ID.
\ **Примітка:** Ви повинні викликати цей метод між додаванням завдання і очікуванням його завершення.
.. rst-class:: classref-item-separator
----
.. _class_WorkerThreadPool_method_wait_for_group_task_completion:
.. rst-class:: classref-method
|void| **wait_for_group_task_completion**\ (\ group_id\: :ref:`int<class_int>`\ ) :ref:`🔗<class_WorkerThreadPool_method_wait_for_group_task_completion>`
Застосує нитку, яка викликає цей метод до завершення групового завдання.
.. rst-class:: classref-item-separator
----
.. _class_WorkerThreadPool_method_wait_for_task_completion:
.. rst-class:: classref-method
:ref:`Error<enum_@GlobalScope_Error>` **wait_for_task_completion**\ (\ task_id\: :ref:`int<class_int>`\ ) :ref:`🔗<class_WorkerThreadPool_method_wait_for_task_completion>`
Застосує нитку, яка викликає цей метод до завершення завдання з даним ID.
Повернення :ref:`@GlobalScope.OK<class_@GlobalScope_constant_OK>`, якщо завдання було успішно очікувано.
Повертає :ref:`@GlobalScope.ERR_INVALID_PARAMETER<class_@GlobalScope_constant_ERR_INVALID_PARAMETER>`, якщо завдання з пропущеним ідентифікатором не існує (можливо, тому що це було вже очікувано і вкладеного).
Повертає :ref:`@GlobalScope.ERR_BUSY<class_@GlobalScope_constant_ERR_BUSY>`, якщо виклик виготовлений з іншого ходового завдання і, зважаючим завданням, є потенціал для блокування (наприклад, завдання, щоб очікувати може бути на рівні нижнього рівня у клацці виклику і тому не може прогресувати). Це розширена ситуація, яка повинна бути тільки в тому випадку, коли деякі завдання залежать від інших (у поточній реалізації, хитрий випадок - це завдання, намагаючись чекати старшого).
.. |virtual| replace:: :abbr:`virtual (Зазвичай, цей метод перевизначається користувачем, щоб він мав вплив.)`
.. |required| replace:: :abbr:`required (This method is required to be overridden when extending its base class.)`
.. |const| replace:: :abbr:`const (Цей метод не має побічних ефектів. Не змінює ніяку змінну екземпляра об'єкта.)`
.. |vararg| replace:: :abbr:`vararg (Цей метод приймає будь-яке число аргументів після описаних тут.)`
.. |constructor| replace:: :abbr:`constructor (Цей метод використовується для побудови типів.)`
.. |static| replace:: :abbr:`static (Цей метод не потребує екземпляра для виклику, його можна викликати безпосередньо за допомогою назви класу.)`
.. |operator| replace:: :abbr:`operator (Цей метод описує дійсний оператор для взаємодії з цим типом як з лівим операндом.)`
.. |bitfield| replace:: :abbr:`BitField (Це значення є цілим числом, складеним у вигляді бітової маски з наступних прапорів.)`
.. |void| replace:: :abbr:`void (Значення не повертається.)`