Considerare:Python: è os.read()/os.write() su un file os.pipe() threadsafe?
pipe_read, pipe_write = os.pipe()
Ora, vorrei sapere due cose:
(1) Ho due fili. Se garantisco che solo uno sta leggendo os.read(pipe_read,n)
e l'altro sta scrivendo solo os.write(pipe_write)
, avrò qualche problema, anche se i due thread lo fanno simultaneamente? Riceverò tutti i dati che sono stati scritti nell'ordine corretto? Cosa succede se lo fanno simultaneamente? E 'possibile che una singola scrittura viene letta in pezzi, come ?:
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 - ancora una volta, considerare simultaneità - sarà un unico os.write(some_string)
tornare sempre del tutto da un unico os.read(pipe_read, very_big_number)
?
(2) consideri più di un thread per iscritto al pipe_write
estremità del tubo utilizzando logging.handlers.FileHandler()
- Ho letto che il modulo di registrazione è threadsafe. Questo significa che posso farlo senza perdere dati? Penso che non sarò in grado di controllare l'ordine dei dati nella pipe; ma questo non è un requisito. Requisiti:
- tutti i dati scritti da alcuni fili alla fine scrittura devono venire fuori alla fine leggere
- una stringa scritta da un singolo
logger.info(), logger.error(), ...
deve rimanere in un unico pezzo.
Queste richieste sono soddisfatte?
Grazie in anticipo,
Jan-Philip Gehrcke
Btw: Sono a conoscenza di 'Queue.Queue()' e 'select.select()'. Nel mio caso particolare, la comunicazione da Thread A a Thread B sarà tramite 'Queue.Queue()': trasporta "comandi". Al contrario, B-> A trasporterà i messaggi di log e dovrebbe essere realizzato tramite 'os.pipe()' come descritto sopra, perché il thread A ha già implementato un ciclo di eventi basato su 'select.selezionare() ', che può monitorare' pipe_read' e richiamare una funzione di callback se c'è qualcosa di leggibile. –