gpt4 book ai didi

python - 线程池是如何工作的,以及如何在像 NodeJS 这样的异步/等待环境中实现它?

转载 作者:太空狗 更新时间:2023-10-29 21:44:54 25 4
gpt4 key购买 nike

我需要运行一个带有 10_000 个参数的函数 int f(int i),由于 I/O 时间,它需要大约 1 秒的时间来执行。
在像 Python 这样的语言中,我可以使用线程(或者 async/await,我知道,但我稍后会谈到)来并行化这个任务。
如果我想始终有 10 个正在运行的线程,并在它们之间拆分任务,我可以使用 ThreadingPool :

def f(p):
x = [...]
return x

p = ThreadPool()
xs = p.map(f, range(10_000))

但是它是如何工作的?如果我想用 NodeJS 和 f = http("www.google.com", callback) 实现类似的功能,我应该从哪里开始? 这类问题的算法是什么?
同样,我想同时收到 10 个请求,当一个完成后,下一个应该开始。

到目前为止我一直在想什么(丑陋,因为回调正在开始对 f() 函数的新调用):

queue = ["www.google.com", "www.facebook.com"]
var f = function(url) {
http.get(url, (e) => {
const newUrl = queue.pop();
f(newUrl);
});
};

for (var i = 0; i < 10; i++) {
f(queue.pop());
}

最佳答案

重新实现我链接到的那个 Bluebird 函数:

const mapWithConcurrency = async (values, concurrency, fn) => {
let i = 0;
let results = values.map(() => null);

const work = async () => {
while (i < values.length) {
const current = i++;
results[current] = await fn(values[current]);
}
};

await Promise.all(Array.from({length: concurrency}, work));

return results;
};

mapWithConcurrency(Array.from({length: 30 * 15}, (_, i) => i), 10, async i => {
const el = document.body.appendChild(document.createElement('i'));
el.style.left = 5 * (i % 30) + 'px';
el.style.top = 5 * (i / 30 | 0) + 'px';
await new Promise(resolve => { setTimeout(resolve, Math.random() * 500); });
el.style.background = 'black';
return 2 * i;
}).then(results => {
console.log(results.length, results.every((x, i) => x === 2 * i));
});
i {
background: grey;
transition: background 0.3s ease-out;
position: absolute;
width: 5px;
height: 5px;
}

关于python - 线程池是如何工作的,以及如何在像 NodeJS 这样的异步/等待环境中实现它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55191051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com