代码之家  ›  专栏  ›  技术社区  ›  Gustavo Mendonça

如何同时运行多个期货?

  •  0
  • Gustavo Mendonça  · 技术社区  · 7 月前

    我正在使用运行http服务器 actix_web 它有一个接收一些文件的端点,我需要处理这些文件。对于异步运行时,我使用 tokio 。问题是,我想同时处理这些文件,但存在一些问题。

    第一个问题是 body 活得不够长,因为它不是 ' static 键入。 第二个问题是,我需要将一些变量传递给实际处理文件的函数,但我得到了 use of moved value 错误

    这是代码:

    #[post("/images")]
    async fn process_images(
        body: Json<ProcessFilesBody>,
        aws: Data<AWSService>,
    ) -> Result<impl Responder, Error> {
        println!("PROCESSING {:?} FILES", body.0.files.len());
    
        let mut futures = Vec::new();
    
        for file in &body.0.files {
            let handle = spawn(async move {
                process_file(aws.clone(), &file).await;
            });
            futures.push(handle);
        }
    
        for handle in futures {
            handle.await.unwrap();
        }
    
        Ok(HttpResponse::Ok())
    }
    

    我试过包装 aws 中的变量 Arc 但没有起作用,我不知道如何修复文件的生存期

    1 回复  |  直到 7 月前
        1
  •  1
  •   Mahendran R    7 月前

    克隆 body.0.files 在循环外解决生存期问题。

    使用 aws.get_ref().clone() 以克隆内部AWSService。

    #[post("/images")]
    async fn process_images(
        body: Json<ProcessFilesBody>,
        aws: Data<AWSService>,
    ) -> Result<impl Responder, Error> {
        println!("PROCESSING {:?} FILES", body.0.files.len());
    
        let files = body.into_inner().files.clone(); // Clone files here
        let aws_service = aws.get_ref().clone(); // Clone AWSService here
        let mut futures = Vec::new();
    
        for file in files {
            let aws_clone = aws_service.clone(); // Clone for each async block
            let handle = tokio::spawn(async move {
                process_file(aws_clone, file).await;
            });
            futures.push(handle);
        }
    
        for handle in futures {
            handle.await.unwrap();
        }
    
        Ok(HttpResponse::Ok())
    }