我有一个用 Rust 编写的 AWS Lambda,使用 Rust Lambda 运行时。在该 Lambda 中,我想使用 Polars 从 S3 延迟加载 Parquet 文件并对其执行一些转换,然后再将其写回另一个 S3 存储桶。
我遇到的问题(至少,我认为这是问题所在)是 Polars Cloud Storage 实现似乎使用 tokio 的 block_on 方法,但 Lambda 运行时已经使用 tokio 运行程序,因此我收到以下错误:
Cannot start a runtime from within a runtime. This happens because a function (like `block_on`) attempted to block the current thread while the thread is being used to drive asynchronous tasks.
我用来延迟加载 Parquet 文件的代码如下:
let path = "s3://my_bucket/example.parquet"
let args = ScanArgsParquet::default();
match LazyFrame::scan_parquet(path, args) {
Ok(lf) => lf,
Err(_) => return Err(ReadError::ParquetError),
}
我对 Rust 比较陌生,所以我能做些什么来解决这个问题吗?或者我是否必须使用 SDK 自己将文件下载到内存中,然后加载它(以非惰性方式)?
根据 @Chayim Friedman 对原始帖子的评论,这是我最终使用 tokio 的
task::spawn_blocking
:
let res = task::spawn_blocking(move || {
let args = ScanArgsParquet::default();
match LazyFrame::scan_parquet(path, args) {
Ok(lf) => Ok(lf),
Err(e) => Err(e),
}
}).await;
match res {
Ok(r) => match r {
Ok(lf) => Ok(lf),
Err(_) => Err(ReadError::ParquetError)
},
Err(_) => Err(ReadError::ThreadError)
}