Sono corretto suppongo che entro i limiti dello stesso processo che ha 2 thread di lettura/scrittura su una pipe denominata, non blocca affatto il lettore/scrittore? Quindi con orari errati è possibile perdere alcuni dati?Named pipe in Java e multithreading
E in caso di più processi - il lettore aspetterà che alcuni dati siano disponibili e lo scrittore sarà bloccato fino a quando il lettore leggerà tutti i dati forniti dal lettore?
Sto pianificando di utilizzare named pipe per passare diversi (decine, centinaia) di file da un processo esterno e consumarne uno nella mia applicazione Java. Scrivere semplici test unitari per utilizzare un thread per scrivere nella pipe e un altro - per la lettura dalla pipe, ha provocato sporadici errori di test a causa della mancanza di blocchi di dati.
Penso che sia dovuto alla filettatura e allo stesso processo, quindi il mio test non è corretto in generale. Questa supposizione è corretta?
Ecco qualche esempio che illustra il caso:
import java.io.{FileOutputStream, FileInputStream, File}
import java.util.concurrent.Executors
import org.apache.commons.io.IOUtils
import org.junit.runner.RunWith
import org.scalatest.FlatSpec
import org.scalatest.junit.JUnitRunner
@RunWith(classOf[JUnitRunner])
class PipeTest extends FlatSpec {
def md5sum(data: Array[Byte]) = {
import java.security.MessageDigest
MessageDigest.getInstance("MD5").digest(data).map("%02x".format(_)).mkString
}
"Pipe" should "block here" in {
val pipe = new File("/tmp/mypipe")
val srcData = new File("/tmp/random.10m")
val md5 = "8e0a24d1d47264919f9d47f5223c913e"
val executor = Executors.newSingleThreadExecutor()
executor.execute(new Runnable {
def run() {
(1 to 10).foreach {
id =>
val fis = new FileInputStream(pipe)
assert(md5 === md5sum(IOUtils.toByteArray(fis)))
fis.close()
}
}
})
(1 to 10).foreach {
id =>
val is = new FileInputStream(srcData)
val os = new FileOutputStream(pipe)
IOUtils.copyLarge(is, os)
os.flush()
os.close()
is.close()
Thread.sleep(200)
}
}
}
senza Thread.sleep (200) il test non riesce a passare per ragioni
- eccezione tubo rotto
- somma MD5 errata
con questo set di ritardo: funziona alla grande. Sto usando un file con 10 megabyte di dati casuali.
Dovrai fornire un contesto. Dove hai letto che le pipe nominate non bloccano mai? Questo suona poco intuitivo, sono ... beh ... tubi, non secchi straripanti. – millimoose
Personalmente, i frammenti di dati mancanti sembrano errati, è possibile che si stia verificando un buffer di flusso da qualche parte. Prova a utilizzare più * processi *, non i thread per il test.In alternativa, posta una domanda con l'impostazione di prova per chiedere perché perderebbe blocchi di dati. (Il che renderebbe questa una domanda "XY problema". Dovresti chiedere del problema che stai avendo, non delle tue speculazioni sulla causa o soluzione alternativa.) – millimoose
@millimoose Non sto affermando che le pipe nominate non stanno mai bloccando, ma è quello che Vedo nei risultati del test. Il thread "Writer" può scrivere 3 file nella pipe e "Reader" può leggerne solo uno. Questo è confusionario. – jdevelop