2012-05-03 12 views
14

Quiero encontrar una estructura de cola (un contenedor de datos) cuyos elementos deben ser primeros en entrar primero en salir. Es importante para mí que la estructura debe ser segura para subprocesos. Voy a usar este contenedor de datos como algo así como una tarea o conjunto de conexiones.¿Es posible usar el canal almacenado de Go como una cola segura para subprocesos?

Sé que un canal con búfer es seguro para subprocesos, pero me pregunto si funciona como FIFO, especialmente en una situación concurrente.

Y si es posible utilizar el canal almacenado como cola segura para subprocesos, ¿debo preocuparme por su eficacia?

+1

Los canales son la respuesta. Hay pocas posibilidades de encontrar o escribir algo mejor que los canales para esa tarea. – Mostafa

+1

Los canales son especialmente adecuados para colas de tareas, recursos compartidos, grupos de conexiones y similares. Tenga cuidado de no reproducir los patrones de un lenguaje basado en subprocesos ya que uno de los grandes avances del lenguaje Go es el mecanismo de canal de goroutine +. Asegúrese de entenderlo (es probable que pueda enviar una arquitectura o estrategia a SO). –

+1

Esto es lo primero que pensé cuando supe sobre los canales en Go, ¡gracias por preguntar esto! – karysto

Respuesta

2

Estoy bastante seguro de que los canales son FIFO. También son baratos, por lo que serían eficientes en la memoria. Más allá de eso sin conocer los detalles de cómo vas a usarlos. Realmente no podemos dar muchos más consejos.

+0

Gracias. Entonces, ¿los canales son tanto FIFO como Thread-Safe? ¿Podría darme un enlace o algo sobre los detalles de implementación del mecanismo de Channel? – hardPass

+0

La documentación definitiva sería: http://code.google.com/p/go/source/browse/src/pkg/runtime/chan.c Consulte la implementación de chansend y chanrecv para obtener más información. La especificación no dice específicamente que son una cola de fifo, pero se puede deducir de los detalles de cómo usarlos. –

+0

Pero la pregunta es, creo que si el uso de los canales de golang será en la mayoría de los casos, menos seguro, estándar y completo que usar un intermediario de mensajes como RabbitMQ o ActiveMQ con el mismo esfuerzo al final. Entonces no creo que sea un enfoque compensatorio – deFreitas

11

En Go, un canal con búfer es solo eso: una cola FIFO segura para hilos, entonces lo que está intentando hacer es perfectamente válido. No deberías tener problemas de rendimiento en absoluto con este enfoque.

0

En general, diría que los canales con búfer no constituyen una buena cola de concurrencia segura. Al crearlos, se asigna memoria para todo el búfer. Si el tamaño de la cola varía de muy pequeño a muy grande durante la ejecución, debe asignarlo en el peor de los casos y puede desperdiciar mucha memoria.

Cuestiones relacionadas