作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要运行一个带有 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 个请求,当一个完成后,下一个应该开始。
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/
我是一名优秀的程序员,十分优秀!