workspace icon indicating copy to clipboard operation
workspace copied to clipboard

请问线程池可以处理高递归的任务吗

Open YukunJ opened this issue 1 year ago • 1 comments

假设原来有类似这样一个会产生很高递归栈的函数:

int fib(int n) {
  if (n <= 1) {
    return 1;
  }
  return fib(n-1) + fib(n-2);
}

把它改写用threadpool后,有类似这样的:

int fib(int n) {
  if (n <= 1) {
    return 1;
  }
  int a = pool.submit(fib(n-1));
  int b = pool.submit(fib(n-2));
  return a + b;
}

但是我有一个困惑是, 在计算fib(n-1)和fib(n-2)时 原来的fib(n)还是挂在线程池里的某一个worker身上没法被销毁, 也不能被销毁. 这样的话递归不了几层, 所有的线程worker都卡住了.

当然如果超出了现有的线程数量可以去新开数量, 但是面对高递归任务时, 开出来大几百个线程worker会很快使得系统性能下降.

请问有什么能保存当前的context但是又不卡住一个线程资源的使用方法吗

YukunJ avatar Mar 27 '23 15:03 YukunJ

我觉得让线程从队列尾部而不是头部开始处理任务可能可以解决这个问题。但目前Hipe确实不具备这样的能力。一种简单的替代就是把递归任务放在一个任务里,或者尝试一下以任务组的形式提交,并把这个任务组倒过来塞进去。

CodingHanYa avatar Mar 29 '23 13:03 CodingHanYa