【发布时间】:2024-04-12 08:20:02
【问题描述】:
我在 OSX 上有一个 Rust 应用程序启动了大量线程,如下面的代码所示,但是,在查看了我的 OSX 版本允许通过 sysctl kern.num_taskthreads 命令创建的最大线程数之后,我可以看到它是kern.num_taskthreads: 2048,这解释了为什么我无法启动超过 2048 个线程。
我该如何克服这个硬性限制?
let threads = 300000;
let requests = 1;
for _x in 0..threads {
println!("{}", _x);
let request_clone = request.clone();
let handle = thread::spawn(move || {
for _y in 0..requests {
request_clone.lock().unwrap().push((request::Request::new(request::Request::create_request())));
}
});
child_threads.push(handle);
}
【问题讨论】:
-
关于为什么要创建这么多线程的任何详细信息?这似乎太过分了。
-
您认为可以创建一个较小的线程“池”然后对其进行迭代吗?每个线程可以处理多个连接(数百个?)
-
也许在 OS X 上你可以使用 Grand Central Dispatch 代替线程。
dispatch_async到标准并发全局队列之一。 -
“这解释了为什么我不能启动超过 2048 个线程”-“我该如何克服这个硬限制”- 你自己回答了:你不能乙>。您应该改写您的问题以避免XY Problem - 您真的想知道如何创建比创建线程更多的并发 HTTP 请求。
-
对于异步 HTTP 处理,我通常使用 cURL。这是一个质量很好且维护良好的项目。不过,我还没有达到需要从 Rust 使用它的阶段,所以我不能吹嘘一些 Rust 代码。现有的 Rust 驱动程序github.com/carllerche/curl-rust 仅适用于“简单”处理程序,因此不足以完成这项工作。
标签: linux multithreading macos rust