iphone - grand - nsoperationqueue swift 3 example
comportamiento dispatch_get_global_queue (3)
El siguiente código:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"HIGH 1 %d", i);
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"LOW %d", i);
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (int i=0; i<100000; i++) {
NSLog(@"HIGH 2 %d", i);
}
});
los resultados en la mezcla de alto 1, alto 2 y registros bajos.
¿Cómo es que imprime logs high1 y high2 simultáneamente? ¿No están los blogs alto1 y alto2 en la misma cola? Entonces, ¿no debería terminar el bloque high1 antes de comenzar a ejecutar el bloque high2?
Acaba de ilustrar por qué no debería llamar a métodos que no son seguros para subprocesos dentro de dispatch_async
. Si hay suficientes núcleos de procesamiento para ejecutar más trabajos, GCD seguirá adelante y los acumulará, independientemente de si los trabajos anteriores en una cola determinada han regresado todavía. El mismo comportamiento se puede lograr en OS X 10.7 creando sus propias colas con:
dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
Obviamente, se puede llamar a NSLog()
frecuencia que desee sin tener que preocuparse por errores de acceso incorrectos o similares, pero si le preocupa la seguridad de subprocesos o el orden en que regresan sus trabajos, considere usar grupos de despacho.
Eso depende de la máquina que estés ejecutando. Sospecho que está ejecutando esto en su Mac, porque GCD creará automáticamente subprocesos suficientes para el sistema específico para los trabajos en las colas globales. Entonces, probablemente tenga más de un núcleo, por lo que GCD está ejecutando sus trabajos en ambos núcleos.
Si crea su cola usando dispatch_queue_create
, obtiene una cola en serie y se le garantiza el comportamiento FIFO.
FWIW (aunque no debería confiar en este comportamiento), si lo ejecuta en el iPhone, sospecho que verá un comportamiento de cola en serie, porque su iPhone es de un solo núcleo. Sin embargo, no confíe en esto, ¡el iPad 2 es multi-core, creo!
EDITAR:
Documentación para dispatch_get_global_queue
: devuelve una cola concurrente global conocida de un nivel de prioridad determinado.
dispatch_get_global_queue
es una clase de cola de concurrencia. Al especificar la misma prioridad para high1 y high2, el resultado es una mezcla de high1 y high2. Después de eso, será el resultado bajo, ya que tiene una prioridad más baja.