[Python-es] Problema con Queue.put

Chema Cortes pych3m4 en gmail.com
Mie Mayo 9 10:41:18 CEST 2012


El día 9 de mayo de 2012 03:32, Chema Cortes <pych3m4 en gmail.com> escribió:

> [....]
>
>        k.terminate()
>        pool.terminate()
>
> O sea, el proceso "saving" prácticamente se ve interrumpido en el
> mismo momento que extrae el último dato de la queue, que en el caso de
> windows se nota por un fallo general de las I/O.

Aquí me he colado. El problema que hay con windows es que el nuevo
proceso se crea como una copia completamente intacta del intérprete de
python, sin ningún fichero abierto. No pasa como en linux, que es
capaz de hacer un "fork(2)" exáctamente con los mismos recursos
abiertos que poseía el proceso padre.

En windows tienes dos opciones:

1) crear un manager remoto para compartir el fichero entre procesos

2) crear un proceso que se encargue de todas las operaciones con el
fichero, quizás lo más sencillo en tu caso:

def salida(out, fname):

    with open(fname, 'w', buffering=0) as outfile:
        while True:
            msg = out.get()
            print >>outfile, msg
            out.task_done()

if __name__=="__main__":
    print 'Started!'

    q=JoinableQueue()
    out=JoinableQueue()

    ot = Process(target=salida, args=(out,'test_par.txt'))
    ot.daemon = True
    ot.start()

    out.put('This is the test file')
...



-- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


Más información sobre la lista de distribución Python-es