我正在尝试使用 Python 进行多处理器编程。以分而治之的算法Fibonacci
为例。程序的执行流程会像树一样分支出来并并行执行。换句话说,我们有一个嵌套并行的例子。
在 Java 中,我使用线程池模式来管理资源,因为程序可能会非常快速地分支并创建太多短期线程。单个静态(共享)线程池可以通过 ExecutorService
.
我希望Pool也是如此,但似乎Pool 对象不是全局共享的。例如,共享池使用multiprocessing.Manager.Namespace()
将导致错误。
池对象不能在进程之间传递或腌制
我有一个两部分的问题:
- 我在这里想念什么;为什么不应该在进程之间共享池?
- 在 Python 中实现嵌套并行的模式是什么? 如果可能的话,维护一个递归结构,而不是用它来换取迭代。
from concurrent.futures import ThreadPoolExecutor
def fibonacci(n):
if n < 2:
return n
a = pool.submit(fibonacci, n - 1)
b = pool.submit(fibonacci, n - 2)
return a.result() + b.result()
def main():
global pool
N = int(10)
with ThreadPoolExecutor(2**N) as pool:
print(fibonacci(N))
main()
爪哇
public class FibTask implements Callable<Integer> {
public static ExecutorService pool = Executors.newCachedThreadPool();
int arg;
public FibTask(int n) {
this.arg= n;
}
@Override
public Integer call() throws Exception {
if (this.arg > 2) {
Future<Integer> left = pool.submit(new FibTask(arg - 1));
Future<Integer> right = pool.submit(new FibTask(arg - 2));
return left.get() + right.get();
} else {
return 1;
}
}
public static void main(String[] args) throws Exception {
Integer n = 14;
Callable<Integer> task = new FibTask(n);
Future<Integer> result =FibTask.pool.submit(task);
System.out.println(Integer.toString(result.get()));
FibTask.pool.shutdown();
}
}
我不确定这是否重要,但我忽略了“进程”和“线程”之间的区别;对我来说,它们都意味着“虚拟化处理器”。我的理解是,池的目的是共享“池”或资源。正在运行的任务可以向池发出请求。当并行任务在其他线程上完成时,可以回收这些线程并将其分配给新任务。禁止共享池对我来说没有意义,因此每个线程都必须实例化自己的新池,因为这似乎违背了线程池的目的。