parallel-processing - 在 Rust 中,是否可以在多个线程之间共享数据而无需静态生命周期?

标签 parallel-processing rust

<分区>

我正在尝试获取一个大字符串或数据并将其分解成多个片段以跨多个线程进行处理。我想利用多线程来帮助处理数据,但希望避免复制数据。

这是问题的一个例子。 Segment0 可以工作,因为它通过副本拥有数据。 Segment1 只是借用数据并会导致问题,即使连接保证了生命周期的正确性。

use std::thread;
use std::fs;
use std::sync::{Arc};

fn main() {
    let data = fs::read("./test.txt").unwrap();

    let segment_size = data.len()/2;
    let segment0 = &data[0..segment_size]; //Borrow data no copy
    let segment1 = &data[segment_size..]; //Borrow data no copy

    let segment0 = Vec::from(segment0); //has ownership of data through copy

    let thread0 = thread::spawn(move || println!("Thread 0 {:?}",std::str::from_utf8(&segment0)));
    let thread1 = thread::spawn(move || println!("Thread 1 {:?}",std::str::from_utf8(segment1)));

    thread0.join(); //thread 0 terminated segment0 dropped
    thread1.join(); //thread 1 terminated segment1 dropped

    //data released  segment0 and segment1 needed to be dropped before
}

返回的错误

error[E0597]: `data` does not live long enough
--> src/main.rs:10:25
|
10 |         let segment1 = &data[segment_size..]; //Borrow data no copy
|                         ^^^^ borrowed value does not live long enough
...
21 |     }
|     - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...

最佳答案

谢谢 scoped_threadpool 解决了我的问题这是我的解决方案

extern crate scoped_threadpool;
use std::thread;
use std::fs;
use std::sync::{Arc};

use scoped_threadpool::Pool;


fn main() {
    let data = fs::read("./test.txt").unwrap();

    let segment_size = data.len() / 2;
    let segment0 = &data[0..segment_size]; //Borrow data no copy
    let segment1 = &data[segment_size..]; //Borrow data no copy

    let mut pool = Pool::new(2);

    pool.scoped(|scoped| {
        scoped.execute(move || println!("Thread 0 {:?}", std::str::from_utf8(segment0)));
        scoped.execute(move || println!("Thread 1 {:?}", std::str::from_utf8(segment1)));
    });
}

关于parallel-processing - 在 Rust 中,是否可以在多个线程之间共享数据而无需静态生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50556314/

相关文章:

python - 我怎样才能让我的 Luigi 调度程序利用带有并行调度标志的多个内核?

c# - 多个API调用的Asp.net MVC4并行编程

rust - 如何在 WebAssembly 中使用 web-sys 发出带有 JSON 正文的 POST 请求?

rust - Tokio 任务在完成前退出

rust - 是否可以将变量作为标识符传递给宏?

java - 如何使用SpringBoot的@RestController并行处理多个请求?

c# - 如何在 lambda 方法中传递参数和异步关键字?

c - 使用降雪包在 R 中使用 C-within-R 函数进行并行计算。问题 : Mac shows loading wheels and almost freezes

Rust 负循环?

string - 遍历一个字符串,一次 n 个元素