私はPythonでマルチプロセッサプログラミングを試みています。例えば、Fibonacci
のような分裂と征服のアルゴリズムを取る。実行のプログラムフローはツリーのように分岐し、並列に実行されます。つまり、nested parallelismの例があります。Pythonでネストされた並列処理
Javaから、リソースを管理するためにスレッドプールパターンを使用しました。プログラムは非常に短時間で分岐し、短命のスレッドを非常に多く作成する可能性があるからです。単一の静的(共有)スレッドプールは、ExecutorService
によってインスタンス化できます。
Poolについては同じことが期待されますが、Pool object is not to be globally sharedと表示されます。たとえば、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()
の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();
}
}
それがここで問題あれば、私はわからないんだけど、私は "プロセス" と "スレッド" との違いを無視しています。私にとっては両方とも「仮想化されたプロセッサ」を意味します。私の理解は、プールの目的は "プール"またはリソースの共有のためです。タスクを実行すると、プールにリクエストを送信できます。並列タスクが他のスレッドで完了すると、それらのスレッドを再利用して新しいタスクに割り当てることができます。プールの共有を拒否することは意味がありません。そのため、スレッドプールの目的を破るように見えるので、各スレッドは独自の新しいプールをインスタンス化する必要があります。
なぜグローバルに共有する必要がありますか?1つの名前空間/クラス内にすべてを含めることはできませんか? –
@InbarRose異なるプロセス内で再帰呼び出しを実行する再帰関数では、プールがforkされ、サブプロセスによって呼び出されるという問題があります。このため、キューに問題が発生し、動作しません。とにかく、Javaでは* threads *を使用していることを強調したいと思います。スレッドでは、プールオブジェクトの分岐がないため、問題はありません。私は、Javaでプロセスプールを使用することは、多かれ少なかれ、同じ動作につながると考えています。 – Bakuriu
@InbarRoseクラスインスタンスと静的変数として 'Pool'を含めてみましたが、それでも問題は同じになりました。例えば、 'Pool'と再帰呼び出しは単一のクラスに含まれていますが、それでもやはり同じ問題が発生します。>プールオブジェクトはプロセス間を渡すことができません。 –