我有一个使用PyO3和Rust编写的Python库,其中涉及一些昂贵的计算(单个函数调用最长需要10分钟)。在从Python中调用时如何终止执行?
Ctrl+C似乎只能在执行结束后处理,因此基本上是无用的。
最小可重现示例:
# Cargo.toml
[package]
name = "wait"
version = "0.0.0"
authors = []
edition = "2018"
[lib]
name = "wait"
crate-type = ["cdylib"]
[dependencies.pyo3]
version = "0.10.1"
features = ["extension-module"]
// src/lib.rs
use pyo3::wrap_pyfunction;
#[pyfunction]
pub fn sleep() {
std::thread::sleep(std::time::Duration::from_millis(10000));
}
#[pymodule]
fn wait(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_wrapped(wrap_pyfunction!(sleep))
}
$ rustup override set nightly
$ cargo build --release
$ cp target/release/libwait.so wait.so
$ python3
>>> import wait
>>> wait.sleep()
在输入 wait.sleep()
后立即按下 Ctrl+C
,屏幕上将打印出字符^C
,但是直到10秒钟之后我才最终得到结果。
>>> wait.sleep()
^CTraceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>>
KeyboardInterrupt
被检测到,但直到Rust函数调用结束之前仍未处理。有没有绕过这个问题的方法?当将Python代码放在文件中并从REPL外执行时,行为相同。
await
)可被取消,但我不知道 PyO3 是否支持它们。 - mcarton