You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AWS Lambda(Rust运行时)中使用Polars访问S3的线程冲突问题求助

问题描述

我用Rust Lambda Runtime编写了一个AWS Lambda,想要通过Polars延迟加载S3中的Parquet文件,完成转换后写入另一个S3存储桶。目前遇到报错:

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将文件下载到内存后以非延迟方式加载?

解决方案

不用非得把文件下载到内存,有几个更高效的处理方式:

1. 改用Polars异步云存储后端

Polars默认的S3后端依赖s3fs,内部会调用tokio::block_on,这和Lambda已有的tokio运行时冲突。你可以切换到异步实现:

  • 添加polars-aws依赖并启用async特性
  • 使用LazyFrame::scan_parquet_async方法,配合Polars提供的异步S3读取器

示例代码:

use polars::prelude::*;
use polars_aws::cloud::CloudOptions;

// 初始化异步S3配置
let cloud_options = CloudOptions::default().with_aws().await?;

// 异步扫描S3上的Parquet文件
let lf = LazyFrame::scan_parquet_async(
    "s3://my_bucket/example.parquet",
    ScanArgsParquet::default(),
    Some(cloud_options),
).await?;

// 执行数据转换
let result = lf.with_columns([/* 你的转换逻辑 */]).collect().await?;
// 异步写入目标S3桶
result.write_parquet("s3://target_bucket/result.parquet", ParquetWriteOptions::default()).await?;

2. 用独立线程池隔离同步操作(备选)

如果不想修改异步后端,可以把Polars的同步操作放到单独的阻塞线程池里,避免和Lambda的tokio运行时冲突:

  • 使用tokio::task::spawn_blocking包装扫描和转换逻辑

示例代码:

use tokio::task;

let path = "s3://my_bucket/example.parquet";
let args = ScanArgsParquet::default();

// 把Polars的阻塞操作放到独立线程执行
let lf = task::spawn_blocking(move || {
    LazyFrame::scan_parquet(path, args)
}).await??;

// 转换逻辑同样用spawn_blocking包装
let result = task::spawn_blocking(move || {
    lf.with_columns([/* 你的转换逻辑 */]).collect()
}).await??;

核心思路

报错的本质是Polars同步云存储实现会在内部启动新的tokio运行时,而Lambda已经有一个运行时在运行,导致嵌套冲突。解决方向无非两种:

  • 复用Lambda的tokio运行时,用Polars的异步API操作云存储
  • 把同步操作隔离到独立线程池,和Lambda的运行时解耦

内容的提问来源于stack exchange,提问作者James Baker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:49:53