WorkerThreadPool

Hereda: Object

Un singleton que asigna algunos Threads al inicio, usado para descargar tareas a estos hilos.

Descripción

El singleton WorkerThreadPool asigna un conjunto de Threads (llamados hilos de trabajo) al inicio del proyecto y proporciona métodos para descargar tareas a ellos. Esto puede ser usado para multihilo simple sin tener que crear Threads.

Las tareas contienen el Callable para ser ejecutado por los hilos. WorkerThreadPool puede ser usado para crear tareas regulares, que serán tomadas por un hilo de trabajo, o tareas de grupo, que pueden ser distribuidas entre múltiples hilos de trabajo. Las tareas de grupo ejecutan el Callable múltiples veces, lo que las hace útiles para iterar sobre muchos elementos, como los enemigos en una arena.

Aquí hay un ejemplo de cómo descargar una función costosa a los hilos de trabajo:

var enemies = [] # Un array para ser llenado con enemigos.

func process_enemy_ai(enemy_index):
    var processed_enemy = enemies[enemy_index]
    # Lógica costosa...

func _process(delta):
    var task_id = WorkerThreadPool.add_group_task(process_enemy_ai, enemies.size())
    # Otro código...
    WorkerThreadPool.wait_for_group_task_completion(task_id)
    # Otro código que depende de que la IA del enemigo ya esté procesada.

El código anterior se basa en que el número de elementos en el array enemies permanezca constante durante la parte multihilo.

Nota: El uso de este singleton podría afectar negativamente al rendimiento si la tarea que se distribuye entre los hilos no es computacionalmente costosa.

Tutoriales

Métodos

int

add_group_task(action: Callable, elements: int, tasks_needed: int = -1, high_priority: bool = false, description: String = "")

int

add_task(action: Callable, high_priority: bool = false, description: String = "")

int

get_caller_group_id() const

int

get_caller_task_id() const

int

get_group_processed_element_count(group_id: int) const

bool

is_group_task_completed(group_id: int) const

bool

is_task_completed(task_id: int) const

void

wait_for_group_task_completion(group_id: int)

Error

wait_for_task_completion(task_id: int)


Descripciones de Métodos

int add_group_task(action: Callable, elements: int, tasks_needed: int = -1, high_priority: bool = false, description: String = "") 🔗

Añade action como una tarea de grupo para que la ejecuten los hilos de trabajo. El Callable se llamará varias veces basándose en elements, con el primer hilo llamándolo con el valor 0 como parámetro, y cada ejecución consecutiva incrementando este valor en 1 hasta que alcance element - 1.

El número de hilos a los que se distribuye la tarea se define mediante tasks_needed, donde el valor predeterminado -1 significa que se distribuye a todos los hilos de trabajo. high_priority determina si la tarea tiene una prioridad alta o una prioridad baja (por defecto). Opcionalmente puedes proporcionar una description para ayudar con la depuración.

Devuelve un ID de tarea de grupo que puede ser usado por otros métodos.

Advertencia: Se debe esperar a que cada tarea se complete usando wait_for_task_completion() o wait_for_group_task_completion() en algún momento para que cualquier recurso asignado dentro de la tarea pueda ser limpiado.


int add_task(action: Callable, high_priority: bool = false, description: String = "") 🔗

Añade action como una tarea para que la ejecute un hilo de trabajo. high_priority determina si la tarea tiene una prioridad alta o una prioridad baja (por defecto). Opcionalmente, puedes proporcionar una description para ayudar con la depuración.

Devuelve un ID de tarea que puede ser usado por otros métodos.

Advertencia: Se debe esperar a que cada tarea se complete usando wait_for_task_completion() o wait_for_group_task_completion() en algún momento para que cualquier recurso asignado dentro de la tarea pueda ser limpiado.


int get_caller_group_id() const 🔗

Devuelve el ID del grupo de tareas del hilo actual que llama a este método, o -1 si no es válido o el hilo actual no forma parte de un grupo de tareas.


int get_caller_task_id() const 🔗

Devuelve el ID de tarea del hilo actual que llama a este método, o -1 si la tarea es una tarea de grupo, no es válida o el hilo actual no forma parte del pool de hilos (por ejemplo, el hilo principal).

Puede ser utilizado por una tarea para obtener su propio ID de tarea, o para determinar si el código actual se está ejecutando dentro del pool de hilos de trabajo.

Nota: Las tareas de grupo tienen sus propios ID, por lo que este método devolverá -1 para las tareas de grupo.


int get_group_processed_element_count(group_id: int) const 🔗

Devuelve cuántas veces el Callable de la tarea de grupo con el ID dado ya ha sido ejecutado por los hilos de trabajo.

Nota: Si un hilo ha comenzado a ejecutar el Callable pero aún no ha terminado, no se contará.


bool is_group_task_completed(group_id: int) const 🔗

Devuelve true si la tarea de grupo con el ID dado está completada.

Nota: Sólo deberías llamar a este método entre la adición de la tarea de grupo y la espera de su finalización.


bool is_task_completed(task_id: int) const 🔗

Devuelve true si la tarea con el ID dado está completada.

Nota: Sólo deberías llamar a este método entre la adición de la tarea y la espera de su finalización.


void wait_for_group_task_completion(group_id: int) 🔗

Pausa el hilo que llama a este método hasta que la tarea de grupo con el ID dado se complete.


Error wait_for_task_completion(task_id: int) 🔗

Pausa el hilo que llama a este método hasta que se complete la tarea con el ID dado.

Devuelve @GlobalScope.OK si la tarea se pudo esperar con éxito.

Devuelve @GlobalScope.ERR_INVALID_PARAMETER si no existe una tarea con el ID pasado (tal vez porque ya se esperó y se eliminó).

Devuelve @GlobalScope.ERR_BUSY si la llamada se realiza desde otra tarea en ejecución y, debido a la programación de tareas, existe la posibilidad de que se produzca un interbloqueo (por ejemplo, la tarea que se va a esperar puede estar en un nivel inferior en la pila de llamadas y, por lo tanto, no puede progresar). Esta es una situación avanzada que solo debería importar cuando algunas tareas dependen de otras (en la implementación actual, el caso difícil es una tarea que intenta esperar a una más antigua).