considerar:Python: es os.read()/os.write() en un os.pipe() threadsafe?
pipe_read, pipe_write = os.pipe()
Ahora, me gustaría saber dos cosas:
(1) Tengo dos hilos. Si garantizo que solo uno está leyendo os.read(pipe_read,n)
y el otro solo está escribiendo os.write(pipe_write)
, ¿tendré algún problema, incluso si los dos hilos lo hacen simultáneamente? ¿Recibiré todos los datos escritos en el orden correcto? ¿Qué pasa si lo hacen simultáneamente? ¿Es posible que una sola escritura se lee en pedazos, como ?:
Thread 1: os.write(pipe_write, '1234567')
Thread 2: os.read(pipe_read,big_number) --> '123'
Thread 2: os.read(pipe_read,big_number) --> '4567'
O - de nuevo, tenga en cuenta la simultaneidad - tendrá un solo os.write(some_string)
siempre devolverá en su totalidad por un único os.read(pipe_read, very_big_number)
?
(2) Considerar más de un hilo escrito al final pipe_write
de la tubería usando logging.handlers.FileHandler()
- He leído que el módulo de registro es multi-hilo. ¿Esto significa que puedo hacer esto sin perder datos? Creo que no podré controlar el orden de los datos en la tubería; pero esto no es un requisito. Requisitos:
- todos los datos escritos por algunos hilos en el extremo de escritura deben salido al final leer
- una cadena escrita por un solo
logger.info(), logger.error(), ...
tiene que permanecer en una sola pieza.
¿Se cumplen estos requisitos?
gracias de antemano,
Jan-Philip Gehrcke
Por cierto: conozco 'Queue.Queue()' y 'select.select()'. En mi caso especial, la comunicación del Hilo A al Hilo B será a través de 'Queue.Queue()': transporta 'comandos'. Por el contrario, B-> A transportará mensajes de registro y se realizará a través de 'os.pipe()' como se describió anteriormente, porque el Tema A ya ha implementado un bucle de evento basado en 'select.select() ', que puede monitorear' pipe_read' e invocar una función de devolución de llamada si hay algo legible. –