我正在嘗試Stream使用具有阻塞捕獲方法的相機創建一個。阻塞呼叫用blocking::unblock.
use futures::stream;
use rscam::{Camera, Config};
fn frame_stream() -> impl stream::Stream {
let mut camera = Camera::new("/dev/video0").unwrap();
camera.start(&Config {
interval: (1, 30),
resolution: (1280, 720),
format: b"H264",
..Default::default()
}).unwrap();
stream::unfold(camera, |c| async move {
let frame = blocking::unblock(|| c.capture().unwrap()).await;
Some((frame, c))
})
}
編譯給出此錯誤訊息:
error[E0373]: closure may outlive the current function, but it borrows `c`, which is owned by the current function
--> src/lib.rs:15:39
|
15 | let frame = blocking::unblock(|| c.capture().unwrap()).await;
| ^^ - `c` is borrowed here
| |
| may outlive borrowed value `c`
|
note: function requires argument type to outlive `'static`
--> src/lib.rs:15:21
|
15 | let frame = blocking::unblock(|| c.capture().unwrap()).await;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: to force the closure to take ownership of `c` (and any other referenced variables), use the `move` keyword
|
15 | let frame = blocking::unblock(move || c.capture().unwrap()).await;
|
error[E0505]: cannot move out of `c` because it is borrowed
--> src/lib.rs:17:22
|
15 | let frame = blocking::unblock(|| c.capture().unwrap()).await;
| ------------------------------------------
| | | |
| | | borrow occurs due to use in closure
| | borrow of `c` occurs here
| argument requires that `c` is borrowed for `'static`
16 |
17 | Some((frame, c))
| ^ move out of `c` occurs here
我如何向編譯器保證c閉包中的參考仍然有效?我認為它會是,因為在c回傳之前等待關閉的執行。
解決方案
stream::unfold(camera, |c| async move {
Some(
blocking::unblock(|| {
(c.capture().unwrap(), c)
}).await
)
})
uj5u.com熱心網友回復:
您可以將相機移動到內部封閉中,然后在幀捕獲完成后將其回傳:
stream::unfold(camera, |c| async move {
Some(blocking::unblock(|| move {
let frame = c.capture().unwrap()).await;
(frame,c)
})
})
uj5u.com熱心網友回復:
.await不保證活性。這是作用域異步任務的普遍問題。期貨可以隨時取消。考慮:
let future = async {
let local = 123;
blocking::unblock(|| local).await;
};
// Poll `future`, but only once.
futures::block_on(async move { futures::poll!(future) });
我們使用本地資料開始了一項任務,然后放棄了未來。任務繼續執行,但本地資料消失了。出于這個原因,目前沒有可靠的方法來公開異步 API,從而允許使用類似于作用域執行緒的本地資料。您必須使用'static資料,例如將Arc.
另見blocking問題#4。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498333.html
