Resuming read after timeout
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Cần làm rõ
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- rust
- Lĩnh vực
- cli, operating-systems
Hướng nghiên cứu
Bắt đầu bằng việc kiểm tra rexpect::exp_eof và đường dẫn reader.try_read được drain_read_buffer sử dụng, tập trung vào những gì vẫn còn được đệm sau khi hết thời gian chờ. Xác định "đọc mọi thứ khả dụng sau 100ms" nên trả về gì và cách các lần đọc tiếp theo cần tránh trả về lại đầu ra trước đó; xác thực hành vi bằng một tiến trình PTY tạo đầu ra tăng dần.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
I have a
pub session: Option<Arc<Mutex<PtySession>>>,
I want to get the existing output of a process after 100ms. This seemed to work at first:
let output = {
let session_mutex = self.session.as_mut().ok_or(anyhow!("No session"))?;
let mut session = session_mutex.lock()?;
match session.exp_eof() {
Ok(output) => output,
Err(e) => {
match e {
rexpect::error::Error::Timeout { got, .. } => got
.replace("`\\n`\n", "\n")
.replace("`\\r`", "\r")
.replace("`^`", "\u{1b}"),
_ => return Err(e.into()),
}
}
}
};
but then I realized that session.exp_eof does not drain the buffer if a timeout is reached, meaning that if I try to read the next chunk, the entire output up to this point is going to be returned yet again. This seems to work:
fn drain_read_buffer(&mut self) -> ZammResult<String> {
let mut output = String::new();
if let Some(session) = self.session.as_mut() {
let reader = &mut session.lock()?.reader;
while let Some(chunk) = reader.try_read() {
output.push(chunk);
}
}
Ok(output)
}
...
let mut output = String::new();
loop {
sleep(Duration::from_millis(100));
let new_output = self.drain_read_buffer()?;
if new_output.is_empty() {
break;
}
output.push_str(&new_output);
}
But I'm wondering, is there a better way to implement "read whatever is available after 100ms" than this?
- Ngôn ngữ chính
- Rust
- Star
- 391
- Fork
- 69
- Merge trung bình
- 1 ngày 34 phút
- Pull request đã merge (30 ngày)
- 2
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của rust-cli/rexpect
-
Strict output expectations Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 38/100
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
-
Disabling bracketed paste mode Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 45/100
-
Configurable sleeps Đang mở
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 48/100
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 25/100
Tất cả issue của rust-cli/rexpect
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
-
bug core
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
-
JIT-compiled number -> Decimal conversion silently overflows instead of raising DECIMAL_OVERFLOW Đang mởfuzz
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
ClickHouse/ClickHouse#122114 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
linebender/vello_svg#90 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100