Python でマルチプロセッサ プログラミングを試しています。Fibonacci
たとえば、分割統治アルゴリズムを考えてみましょう。プログラムの実行フローはツリーのように分岐し、並列に実行されます。つまり、ネストされた並列処理の例があります。
Java から、スレッドプール パターンを使用してリソースを管理しました。これは、プログラムが非常に迅速に分岐し、存続期間の短いスレッドが多数作成される可能性があるためです。を介して、単一の静的 (共有) スレッドプールをインスタンス化できます ExecutorService
。
Poolについても同じことが予想されますが、Pool オブジェクトはグローバルに共有されないようです。たとえば、使用してプールを共有するmultiprocessing.Manager.Namespace()
と、エラーが発生します。
プロセス間でプール オブジェクトを渡すことも、ピクルス化することもできません
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()
ジャワ
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();
}
}
ここで問題になるかどうかはわかりませんが、「プロセス」と「スレッド」の違いを無視しています。私にとっては、どちらも「仮想化されたプロセッサ」を意味します。私の理解では、プールの目的は「プール」またはリソースを共有することです。実行中のタスクは、プールにリクエストを送信できます。並列タスクが他のスレッドで完了すると、それらのスレッドを回収して新しいタスクに割り当てることができます。プールの共有を禁止して、各スレッドが独自の新しいプールをインスタンス化する必要があるようにすることは、私には意味がありません。