grand - iOS GCD: diferencia entre cualquier cola global y la que tiene prioridad de fondo(DISPATCH_QUEUE_PRIORITY_BACKGROUND)?
multithreading swift 4 (2)
Esto se explica bastante bien en el encabezado dispatch / queue.h:
DISPATCH_QUEUE_PRIORITY_HIGH Los elementos enviados a la cola se ejecutarán con alta prioridad, es decir, la cola se programará para la ejecución antes de cualquier prioridad predeterminada o cola de baja prioridad.
DISPATCH_QUEUE_PRIORITY_DEFAULT Los elementos enviados a la cola se ejecutarán con la prioridad predeterminada, es decir, la cola se programará para su ejecución después de que se hayan programado todas las colas de alta prioridad, pero antes de programar cualquier cola de baja prioridad.
DISPATCH_QUEUE_PRIORITY_LOW Los artículos enviados a la cola se ejecutarán con baja prioridad, es decir, la cola se programará para la ejecución después de que se hayan programado todas las prioridades predeterminadas y las colas de prioridad alta.
DISPATCH_QUEUE_PRIORITY_BACKGROUND Los artículos enviados a la cola se ejecutarán con prioridad de fondo, es decir, la cola se programará para su ejecución después de que se hayan programado todas las colas de mayor prioridad y el sistema ejecutará elementos en esta cola en un hilo con estado de fondo según setpriority (2) ( es decir, la E / S de disco se regula y la prioridad de programación de la secuencia se establece en el valor más bajo).
Y tenga en cuenta que esta es una cola global . Otras cosas, como los marcos del sistema, pueden estar programando. Es muy fácil privar de comida a las bandas de prioridad: si hay muchas tareas DISPATCH_QUEUE_PRIORITY_HIGH
programadas, las tareas con la prioridad predeterminada pueden tener que esperar bastante tiempo antes de ejecutarse. Y las tareas en DISPATCH_QUEUE_PRIORITY_BACKGROUND pueden tener que esperar mucho tiempo, ya que todas las demás prioridades encima de ellas deben estar vacías.
Muchos desarrolladores abusan de la cola concurrente global. Quieren ejecutar un bloque, necesitar una cola, y simplemente usar eso con la prioridad predeterminada. Ese tipo de práctica puede llevar a algunos muy difíciles de solucionar errores. La cola concurrente global es un recurso compartido y debe tratarse con cuidado. En la mayoría de los casos, tiene más sentido crear una cola privada.
Una cola concurrente no es asincrónica, es concurrente. Las tareas sincrónicas aún se pueden programar en él, y todavía se ejecutarán de forma síncrona. Las colas concurrentes, como las colas en serie, dequeue en orden FIFO. Ejecutan bloques al mismo tiempo, a diferencia de las colas de serie. Concurrente y asincrónico no son lo mismo.
También tenga en cuenta que si el hilo principal está inactivo, una cola simultánea puede reutilizar ese hilo, y de hecho lo preferirá para crear nuevos hilos. El uso de una cola concurrente no garantiza que no bloqueará la interfaz de usuario:
Los bloques enviados a estas colas de envío se invocan en un conjunto de subprocesos totalmente administrados por el sistema. No se garantiza el hilo con el que se invocará un bloque; sin embargo, se garantiza que solo se invocará un bloque enviado a la cola de despacho FIFO a la vez.
GCD no garantiza qué subprocesos se usarán para ejecutar un bloque en una cola simultánea. Si usa la cola principal, el bloque se ejecutará en serie en el hilo principal. Una cola simultánea puede usar cualquier subproceso y, como optimización, preferirá utilizar subprocesos existentes. Solo creará un nuevo hilo si no hay hilos disponibles para reutilizar. Y, de hecho, el hilo principal suele ser su primera opción (si el hilo principal está disponible para el trabajo) porque es "cálido".
Para reiterar: con Grand Central Dispatch puede estar seguro de que una tarea se ejecutará en el hilo principal (mediante el envío a la cola principal). No puede estar seguro de que una tarea no se ejecutará en el hilo principal.
Estoy leyendo la Guía de programación de Concurrencia y las cosas me confunden.
Veo mucho código invocando lo siguiente para cualquier tarea en segundo plano:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
Ahora lo que quiero decir con ''antecedentes'' es el significado popular:
Algo que se ejecuta en cualquier lugar que no sea el hilo principal (UI)
Entonces, siguiendo los documentos, la declaración anterior devuelve cualquier cola no principal con diferentes prioridades.
Mi pregunta es: ¿por qué entonces DISPATCH_QUEUE_PRIORITY_BACKGROUND
existe? Últimamente también veo muchas tareas asincrónicas usando DISPATCH_QUEUE_PRIORITY_BACKGROUND
específicamente para realizar tareas en segundo plano.
¿Las colas no devueltas con DISPATCH_QUEUE_PRIORITY_DEFAULT
, DISPATCH_QUEUE_PRIORITY_LOW
o DISPATCH_QUEUE_PRIORITY_HIGH
ejecutan muy lejos del hilo principal, si se están devolviendo usando dispatch_get_global_queue
?
¿No son colas de fondo? ¿Qué propósito específico devuelve una cola con DISPATCH_QUEUE_PRIORITY_BACKGROUND
servir? Ya me he referido a esto, pero no aclara mucho, aparte del significado popular que mencioné anteriormente.
Estoy seguro de que estoy bastante confundido con las palabras: antecedentes y colas de fondo. Si alguien puede explicar (mejor, gráficamente), será de gran ayuda.
Si tiene muchas tareas en segundo plano, la CPU o las CPU de su dispositivo se compartirán entre todas ellas. La mayoría de las veces eso es lo correcto. Si una tarea tarda demasiado en finalizar, resuelve el problema tratando de hacerlo más eficiente.
En casos muy raros, puede tener una tarea que lleve mucho tiempo, pero está bien esperarla. Entonces le das prioridad al FONDO. Si hay algún trabajo por hacer con prioridad NORMAL, ese trabajo se realizará primero, y solo cuando haya una CPU de repuesto sin hacer nada más, se realizará la tarea ANTECEDENTES. Y está la cola con ALTA prioridad; las tareas en esa cola se ejecutarán primero; lo haría si una tarea específica necesita terminar lo más rápido posible, incluso si eso significa que otras tareas se retrasan .
Desde el punto de vista de su lógica de programación, las tres colas son idénticas. Solo afecta a las tareas que el sistema operativo intenta terminar primero, y que no le importa demasiado.