Envío de objetos simples entre procesos que utilizan tuberías con el módulo de multiprocesamiento de Python. La documentación indica que si se ha cerrado un conducto, al llamar a pipe.recv() debería aparecer EOFError. En cambio, mi programa simplemente está bloqueando en recv() y nunca detecta que la tubería se ha cerrado.¿Por qué no pipe.close() causa EOFError durante pipe.recv() en el multiproceso de python?
Ejemplo:
import multiprocessing as m
def fn(pipe):
print "recv:", pipe.recv()
print "recv:", pipe.recv()
if __name__ == '__main__':
p1, p2 = m.Pipe()
pr = m.Process(target=fn, args=(p2,))
pr.start()
p1.send(1)
p1.close() ## should generate EOFError in remote process
Y la salida será similar a:
recv: 1
<blocks here>
Puede alguien decirme lo que estoy haciendo mal? Tengo este problema en Linux y Windows/cygwin, pero no con Windows Python.
Por supuesto, esto es correcto, pero el propósito de la pregunta es determinar por qué el cierre de tubería no se comunica entre el proceso primario y secundario, como ocurre en Windows (y como la documentación sugiere que debería). – Luke
Ok, al volver a examinar, tiene toda la razón (y no entendí correctamente su respuesta). La tubería no se considera 'cerrada' hasta que todos los procesos que utilizan el descriptor de archivo la hayan cerrado. – Luke
Una consecuencia interesante/incómoda de esto es que es necesario enviar ambos extremos de la tubería a procesos secundarios para que puedan cerrar uno de manera explícita. – Luke