Почему возникает пауза между последовательным println и оператором print? - PullRequest
0 голосов
/ 07 декабря 2018

Я пишу простой HTTP-запрос, используя стандартные библиотеки net модуль:

use std::io::prelude::*;
use std::net;

fn main() -> std::io::Result<()> {
    let request = 
b"GET / HTTP/1.1
Host: localhost:8080

";

    let mut response = String::new();

    print!("Connecting...");
    let mut stream = net::TcpStream::connect("127.0.0.1:8080")
        .expect("Cannot connect to server");
    println!("Connected!");

    print!("Writing...");
    stream.write(request)
        .expect("Error writing");
    println!("Written!");

    print!("Reading...");
    stream.read_to_string(&mut response)
        .expect("Error reading");
    println!("Read!");

    println!("\nResponse:\n{}", response);
    Ok(())
}

У меня есть простой Express веб-сервер, работающий локально на localhost:8080.

const express = require('express')
const app = express()
const port = 8080

app.get('/', (req, res) => {
  console.time('/')
  res.send('ok')
  console.timeEnd('/')
})

app.listen(port, () => console.log(`Server on ${port}`))

Когда я запускаю программу, между печатью Written! и Reading... наступает вторая или две паузы.Почему возникает эта пауза, когда кажется, что нет ничего для приостановки выполнения?

Вывод сервера:

/: 5.168ms

Вывод ржавчины:

Connecting...Connected!
Writing...Written! // PAUSES HERE AT EOL!
Reading...Read!

Response:
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 2
ETag: W/"2-eoX0dku9ba8cNUXvu/DyeabcC+s"
Date: Thu, 06 Dec 2018 22:32:47 GMT
Connection: keep-alive

ok

1 Ответ

0 голосов
/ 07 декабря 2018

stdout обычно буферизуется строкой, то есть он сохраняет все, что вы записываете в него, в буфер, пока не увидит новую строку.Так что вы ничего не увидите, пока println!("Read!"); не напечатает новую строку.

Если вы хотите отобразить содержимое до этого, вам нужно очистить буфер .

use std::io;  // for io::stdout

...

print!("Reading...");
io::stdout().flush()?;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...