У меня есть поток, который поддерживает список сокетов, и я хотел бы перебирать список, видеть, есть ли что-нибудь, чтобы читать, если так - действовать на него, если нет - перейдите к следующему. Проблема в том, что, как только я сталкиваюсь с первым узлом, все выполнение приостанавливается, пока что-то не дойдет до чтения.Принудительно блокировать чтение с помощью TcpStream
Я использую std::io::Read::read(&mut self, buf: &mut [u8]) -> Result<usize>
От doc
Эта функция не дает никаких гарантий относительно того, ждет она блокирует для данных, но если объект должен блокировать для чтения, но не может его обычно сигнализирует об этом через возвращаемое значение Err.
копания в источник, реализация TcpStream Считанной
impl Read for TcpStream {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
}
Что вызывает
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)
}
И, наконец, называет read<T, L, R>(fd: sock_t, deadline: u64, mut lock: L, mut read: R)
Где я могу видеть петлю над неблокирующими читает пока данные не будут восстановлены или не произойдет ошибка.
Есть ли способ принудительно заблокировать чтение с помощью TcpStream
?
Почему вы не начинаете нить на разъем? –
@ker Эта реализация предназначена для предполагаемого времени соединения 5-30 минут и должна быть способна обрабатывать параллельные соединения около 200 тыс. Я исхожу из предположения, что количество потоков - это плохая вещь, но в настоящее время я пытаюсь вычислить способ вычисления этого, поскольку это будет план B – nathansizemore
Возможно, вы захотите взглянуть на библиотеки AsyncIO, такие как https: //github.com/carllerche/mio – Levans