【问题标题】:Possible to increase UV_THREADPOOL_SIZE on the fly?可以即时增加 UV_THREADPOOL_SIZE 吗?
【发布时间】:2021-09-15 14:26:57
【问题描述】:

我正在 NodeJS 上尝试多线程,并使用下面的代码进行探索

const crypto = require('crypto');

const start = Date.now();

crypto.pbkdf2('a', 'b', 100000, 512, 'sha512', () => {
  console.log('1:', Date.now() - start);
});

crypto.pbkdf2('a', 'b', 100000, 512, 'sha512', () => {
  console.log('2:', Date.now() - start);
});

crypto.pbkdf2('a', 'b', 100000, 512, 'sha512', () => {
  console.log('3:', Date.now() - start);
});

crypto.pbkdf2('a', 'b', 100000, 512, 'sha512', () => {
  console.log('4:', Date.now() - start);
});

crypto.pbkdf2('a', 'b', 100000, 512, 'sha512', () => {
  console.log('5:', Date.now() - start);
});

如果我错了,请纠正我,默认情况下 libuv 的线程池大小为 4,如 here 所述。因此,通过运行上面的代码,每个crypto.pbkdf2 都被分配给单独的线程并同时运行,而第五个将等待一段时间才能运行。下面是结果

1: 484
2: 490
3: 490
4: 490
5: 963

我可以理解第五个crypto.pbkdf2 由于线程并行运行的时间增加了一倍,所以现在我正在探索增加线程池的大小。以下是我的尝试,但结果似乎相同?

$ set UV_THREADPOOL_SIZE=120 && node threads.js 

2: 487
3: 492
1: 493
4: 493
5: 986

【问题讨论】:

  • 将繁重的 CPU 任务放在单独的子进程中,并运行 n 子进程以并行运行代码。

标签: javascript node.js multithreading libuv


【解决方案1】:

您应该通过简单的console.log(process.env.UV_THREADPOOL_SIZE) 验证您是否确实成功设置了环境变量,如果您这样做了,您会发现它是undefined

问题在于你如何调用你的命令,它应该如下所示

UV_THREADPOOL_SIZE=120 node threads.js

【讨论】:

    猜你喜欢
    • 2023-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2013-01-15
    • 2020-01-27
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多