[pyar] Colas e Hilos.

Ignacio Rossi rossi.ignacio en gmail.com
Mie Ago 26 20:19:09 ART 2015


Hola

> Tengo una aplicacion que toma de una cola una cantidad de elementos. Esa
cola la estoy manejando con una lista.

¿Una list común? Si es así y la estás usando sin locks, seguro corrés
peligro de que los multiples threads se pisen entré si. Para evitar eso sin
tener que meterse con locks, tenés la clase Queue [0].

Por otro lado, aunque uses Queue, si removés elementos con varios threads,
la lista puede cambiar entre el chequeo y los pops.

¿La cantidad de elementos tiene que ser fija? Si solo querés limitar la
cantidad de elementos que mandás por el socket en cada pasada, podés
escribir algo así:

enviados = 0
while enviados < 4:
    try:
        socket.send(cola.get())  # OJO: Estoy usando Queue acá
    except Queue.Empty:
        break
    else:
        enviados += 1

Eso (creo, no lo probé :) ) se asegura de enviar a lo sumo 4 elementos, tal
vez son menos. El try/except te soluciona lo de usar el if y que entre el
if y los gets otro thread te "robe" elementos.

> los hilos trabajan de uno a uno en python segun comprendo

No estoy seguro de a que te referís con esto. ¿Estás hablando del Global
Interpreter Lock (GIL) ?

Espero haberte sacado alguna duda.

Saludos

Nacho


[0] https://docs.python.org/3/library/queue.html#module-Queue


El 26 de agosto de 2015, 19:48, Enrique Alejandro Villafañe <
villafane.enrique en gmail.com> escribió:

> Buen dia, tengo un problema grande que he intentado resolver, no lo
> consigo y estoy seguro que sabran la solucion.
>
> Tengo una aplicacion que toma de una cola una cantidad de elementos. Esa
> cola la estoy manejando con una lista. Hasta ahi todo bien.
>
> Pero esa aplicacion envia mediante socket parte de esa lista a un cliente
> cuando el cliente le dice que no tiene nada que hacer, el problema esta en
> que el server tambien trata los items de la cola y a pesar de tener un if
> que me valida el largo de la cola para saber cuantos items voy a enviar, me
> termina siempre al final dando un error de que estoy intentando sacar
> elementos de una cola que se quedo vacia, a pesar de haber hecho
>
> if cola > 4:
>  for i in range(4)
>    socket.send(cola.pop(0))
>
> Lo que pasa es que estoy tambien manejando hilos, y el server principal
> tambien va haciendo parte de tareas de esa cola. No se si lo que pase sea
> que mientras se entra en el if y se cumple el for, el largo de esa cola
> baja y ahi ocurre la excepcion, por eso me pregunto, los hilos trabajan de
> uno a uno en python segun comprendo, pero pudieran alterar el tamano de la
> cola ambos hilos entre el if y el for.
>
> Espero puedan comprender y ayudarme. Gracias nuevamente.
>
> --
> Enrique A Villafañe
>
> *Telefonos de Contacto*
>
> Celular : +58 412 5151603
> Oficina: +58 273 5325224 - +58 273 5321592 - +58 273 5325527
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20150826/ffadb2ea/attachment.html>


More information about the pyar mailing list