2011-07-27 10 views
9

Soy nuevo en las colas y tengo problemas para configurar el siguiente esquema.¿Cómo sincronizar tareas en diferentes colas de distribución?

Tengo tres tareas que hacer.

Tarea A: solo se puede ejecutar en la cola principal, se puede ejecutar de forma asincrónica con la tarea B, no se puede ejecutar de forma asincrónica con la tarea C. Se ejecuta mucho pero se ejecuta con bastante rapidez.

Tarea B: Puede ejecutarse en cualquier cola, puede ejecutarse de forma asincrónica con la tarea A, no puede ejecutarse de forma asíncrona con la tarea C. Se ejecuta con poca frecuencia, pero tarda mucho tiempo en ejecutarse. Necesita la Tarea C para ejecutarse después, pero una vez más la tarea C no puede ejecutarse de forma asíncrona con la tarea A.

Tarea C: Puede ejecutarse en cualquier cola. No se puede ejecutar de forma asíncrona con la tarea A o la tarea B. Se ejecuta con poca frecuencia y se ejecuta rápidamente.

Ahora mismo tengo así:

tarea A se envía a la cola principal por una serie de colas X (una tarea se sometió a Serial X cola para presentar una tarea a la cola principal).

tarea B se somete a cola de serie X.

Tarea C se presenta a la cola principal por la serie X de cola, al igual que la tarea A.

El problema aquí es que la tarea C a veces se ejecuta en el al mismo tiempo que la tarea B. La cola principal a veces ejecuta la tarea C al mismo tiempo que la cola en serie ejecuta la tarea B.

Entonces, ¿cómo puedo asegurarme de que la tarea B y la tarea C nunca se ejecuten al mismo tiempo que permitan A y B para ejecutar al mismo tiempo y evitar que A y C se ejecuten al mismo tiempo? Además, ¿hay alguna manera fácil de asegurarse de que se ejecutan la misma cantidad de veces? (alternando hacia adelante y hacia atrás)

Respuesta

2

Sabes, creo que tuve este problema en mi GRE, solo que A, B y C eran Bob, Larry y Sue y todos trabajaban en la misma oficina.

Creo que esto se puede resolver con una combinación de una cola en serie y un semáforo de envío. Si configura una cola de despacho en serie de un solo ancho y envía las tareas B y C a eso, garantizará que no se ejecutarán al mismo tiempo. A continuación, puede usar un semáforo de envío con un recuento establecido en 1 que se comparte entre las tareas A y C para garantizar que solo se ejecute uno de ellos a la vez. Describo cómo funciona un semáforo en mi respuesta here. Es posible que necesite modificar ese código para usar DISPATCH_TIME_FOREVER de modo que la tarea A se retenga antes de la presentación en lugar de simplemente descartarla si C se está ejecutando (al igual que para la presentación de C).

De esta manera, A y B se ejecutarán en colas diferentes (la cola principal y la cola serie) para que puedan ejecutarse en paralelo, pero B y C no se pueden ejecutar al mismo tiempo debido a su cola compartida, ni A y C debido al semáforo.

En lo que respecta al equilibrio de carga en A y C (lo que supongo que desea equilibrar), probablemente sea bastante específico de la aplicación y requiera cierta experimentación de su parte para ver cómo intercalar acciones correctamente sin ciclos de desgaste. También me aseguro de que realmente los necesites para alternar de manera uniforme, o si puedes salir adelante con uno corriendo un poco más que otro.

+0

Perfecto, eso es exactamente lo que tenía que hacer. ¡Gracias un montón! – Randall

0

¿Revisó NSOperation para sincronizar sus operaciones? Puede manejar dependencias allí.

0

Hay una manera mucho más simple, por supuesto, suponiendo que C siempre debe seguir A y B, que es tener A y B programar C como devoluciones de finalización para sus propias operaciones (y tener C verificar para asegurarse de que no corriendo, en caso de que A y B pidan que ocurra simultáneamente). El patrón de devolución de llamada de finalización (descrito en la página man dispatch_async) es muy potente y una excelente forma de serializar las operaciones asincrónicas que, no obstante, deben ser acopladas.

Donde el problema es A, B, C, D y E donde AD puede ejecutarse de manera asíncrona y E siempre debe ejecutarse al final, los grupos de despacho son una mejor solución ya que puede configurar E para ejecutar la devolución de llamada todo el grupo y luego simplemente poner AE en ese grupo.

Cuestiones relacionadas