WorkerThreadPool
Успадковує: Object
Однотон, який виділяє деякі Thread на старті, використовується для виконання завдань на ці нитки.
Опис
Синглтон WorkerThreadPool виділяє набір Thread (так званих робочих потоків) під час запуску проекту та надає методи для розвантаження завдань на них. Це можна використовувати для простих багатопотоковість без необхідності створення Thread.
Завдання містять Callable для виконання потоками. WorkerThreadPool можна використовувати для створення звичайних завдань, які буде виконано одним робочим потоком або груповими завданнями, які можна розподілити між кількома робочими потоками. Групові завдання виконують Callable кілька разів, що робить їх корисними для ітерації по багатьох елементах, таких як вороги на арені.
Ось приклад того, як перенести ресурсоємну функцію на робочі потоки:
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)
# Інший код, який залежить від ворожого ШІ, що вже обробляється.
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 залишається постійною протягом багатопотокової частини.
Примітка: Використання цього синглтона може негативно вплинути на продуктивність, якщо завдання, що розподіляється між потоками, не є обчислювально ресурсоємним.
Посібники
Методи
add_group_task(action: Callable, elements: int, tasks_needed: int = -1, high_priority: bool = false, description: String = "") |
|
add_task(action: Callable, high_priority: bool = false, description: String = "") |
|
get_caller_group_id() const |
|
get_caller_task_id() const |
|
get_group_processed_element_count(group_id: int) const |
|
is_group_task_completed(group_id: int) const |
|
is_task_completed(task_id: int) const |
|
void |
wait_for_group_task_completion(group_id: int) |
wait_for_task_completion(task_id: int) |
Описи методів
int add_group_task(action: Callable, elements: int, tasks_needed: int = -1, high_priority: bool = false, description: String = "") 🔗
Додає action як групове завдання, яке буде виконуватися робочими потоками. Callable буде викликано певну кількість разів залежно від elements. Для кожного значення від 0 до element - 1 включно буде створено потік, що передасть його як параметр.
Кількість потоків, між якими буде розподілено завдання, визначено tasks_needed, де значення за замовчуванням -1 означає, що воно розподіляється на всі робочі потоки. high_priority визначає, чи завдання має високий пріоритет, чи низький (за замовчуванням). Ви можете додатково надати description, щоб допомогти з відлагодженням.
Повертає ідентифікатор групового завдання, який може використовуватися іншими методами.
Попередження: Кожне завдання повинно бути очікуване для завершення за допомогою wait_for_task_completion() або wait_for_group_task_completion() для звільнення всіх виділених у завданні ресурсів.
int add_task(action: Callable, high_priority: bool = false, description: String = "") 🔗
Додає action як завдання, яке має виконати робочий потік. high_priority визначає, чи має завдання високий чи низький пріоритет (за замовчуванням). Ви можете додатково надати description для допомоги в налагодженні.
Повертає ідентифікатор завдання, який може використовуватися іншими методами.
Попередження: Кожне завдання має бути завершене за допомогою wait_for_task_completion() або wait_for_group_task_completion() у певний момент, щоб будь-які виділені ресурси всередині завдання можна було очистити.
int get_caller_group_id() const 🔗
Повертає ідентифікатор групи завдань поточного потоку, що викликає цей метод, або -1, якщо значення недійсне або поточний потік не є частиною групи завдань.
int get_caller_task_id() const 🔗
Повертає ідентифікатор завдання поточного потоку, що викликає цей метод, або -1, якщо завдання є груповим завданням, недійсним або поточний потік не є частиною пулу потоків (наприклад, головного потоку).
Може використовуватися завданням для отримання власного ідентифікатора завдання або для визначення, чи виконується поточний код у пулі робочих потоків.
Примітка: Групові завдання мають власні ідентифікатори, тому цей метод поверне -1 для групових завдань.
int get_group_processed_element_count(group_id: int) const 🔗
Повертає, скільки разів Callable групового завдання з заданим ID вже було виконано робочими потоками.
Примітка: Якщо потік почався з виконання Callable але ще не закінчився, то його не буде враховано.
bool is_group_task_completed(group_id: int) const 🔗
Повертає true, якщо завершується групове завдання з даним ID.
Примітка: Ви повинні викликати цей метод між додаванням групового завдання і очікуванням його завершення.
bool is_task_completed(task_id: int) const 🔗
Повертаємо true, якщо поставлено завдання з даним ID.
Примітка: Ви повинні викликати цей метод між додаванням завдання і очікуванням його завершення.
void wait_for_group_task_completion(group_id: int) 🔗
Застосує нитку, яка викликає цей метод до завершення групового завдання.
Error wait_for_task_completion(task_id: int) 🔗
Застосує нитку, яка викликає цей метод до завершення завдання з даним ID.
Повернення @GlobalScope.OK, якщо завдання було успішно очікувано.
Повертає @GlobalScope.ERR_INVALID_PARAMETER, якщо завдання з пропущеним ідентифікатором не існує (можливо, тому що це було вже очікувано і вкладеного).
Повертає @GlobalScope.ERR_BUSY, якщо виклик виготовлений з іншого ходового завдання і, зважаючим завданням, є потенціал для блокування (наприклад, завдання, щоб очікувати може бути на рівні нижнього рівня у клацці виклику і тому не може прогресувати). Це розширена ситуація, яка повинна бути тільки в тому випадку, коли деякі завдання залежать від інших (у поточній реалізації, хитрий випадок - це завдання, намагаючись чекати старшого).