Bir iş parçacığım var, bu bir soket listesi tutuyor ve listeyi çaprazlamak istiyorum, okunacak bir şey olup olmadığına bak, eğer öyleyse yap - - Bir sonrakine geç. Sorun, ilk düğümün karşısına gelir gelmez, okumadan bir şey geçene kadar tüm yürütme durdurulur. Ben bir nesne, bir okuma engellemek için gerekiyorsa engeller veri bekleniyor olmadığı hakkında herhangi bir garanti sağlar, ancak vermez docZorla engelleme yok TcpStream ile okuma
itibaren bu işlevi
std::io::Read::read(&mut self, buf: &mut [u8]) -> Result<usize>
kullanıyorum ama yapamıyor
tipik olarak bunu bir Err dönüş değeri ile bildirecektir.
kaynağına Kazı, TcpStream Oku uygulaması nihayet
pub fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
let fd = self.fd();
let dolock = || self.lock_nonblocking();
let doread = |nb| unsafe {
let flags = if nb {c::MSG_DONTWAIT} else {0};
libc::recv(fd,
buf.as_mut_ptr() as *mut libc::c_void,
buf.len() as wrlen,
flags) as libc::c_int
};
read(fd, self.read_deadline, dolock, doread)
}
çağırır Ve
impl Read for TcpStream {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
}
olan olmayan engelleme okur üzerinde ben döngüler nerede bulabiliriz read<T, L, R>(fd: sock_t, deadline: u64, mut lock: L, mut read: R)
çağırır veri alınana veya bir hata oluşana kadar.
Engellemeyen bir okumayı TcpStream
ile zorlamak için bir yol var mı?
Neden soket başına bir iş parçacığı başlatmıyorsunuz? –
@ker Bu uygulama tahmini 5-30 dakika bağlantı süresi içindir ve yaklaşık 200k eşzamanlı bağlantıyı idare edebilmelidir. Ben iş parçacığı miktarının kötü bir şey olduğu varsayımı altında gidiyorum, ama şu anda bunu hesaplamak için bir yol bulmaya çalışıyorum, bu plan B – nathansizemore
olacaktır. Https gibi AsyncIO kitaplıklarına bakmak isteyebilirsiniz: //github.com/carllerche/mio – Levans