我正在尝试使用Python进行多处理器编程。以Fibonacci
为例,采用分而治之的算法。程序执行流会像树一样分支并行执行。换句话说,我们有一个嵌套并行的例子。
从Java中,我使用了线程池模式来管理资源,因为程序可能会很快地分支并创建太多短生命周期的线程。可以通过ExecutorService
实例化单个静态(共享)线程池。
我希望Pool也是如此,但似乎Pool对象不能全局共享。例如,使用multiprocessing.Manager.Namespace()
共享Pool将导致错误。
无法在进程间传递或pickle池对象
我有一个2部分的问题:
- 我在这里缺少什么?为什么进程之间不应该共享池?
- 如何实现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()
Java
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();
}
}
我不确定这里是否有影响,但我忽略了“进程”和“线程”的区别;对我来说,它们都意味着“虚拟处理器”。我的理解是,池的目的是为了共享“池”或资源。运行任务可以向池发出请求。随着其他线程上的并行任务完成,这些线程可以被回收并分配给新任务。不允许共享池似乎对我没有意义,因为每个线程都必须实例化自己的新池,这似乎会破坏线程池的目的。
Pool
作为类实例和静态变量进行包含,但仍然遇到相同的问题。例如,使用Pool
并将递归调用包含在单个类中,但这样做仍然会导致相同的问题:>池对象不能在进程之间传递... - T. Websterapply()
和apply_async()
方法?2.Python池更像是FixedThreadPool(这意味着如果线程不够就会出现死锁),而不是CachedThreadPool(在这种情况下,斐波那契数列会创建一个神话般的分叉炸弹)。以下是Python中的代码示例(虽然没有什么意义)concurrent.futures
和mp.dummy
。 - jfspip install futures
。 - jfs