0

この結果が必要です:

t0 = core 0 Loaded with process 0
t1 = core 1 Loaded with process 1
t2 = core 2 Loaded with process 2
t3 = core 0 Free // a serial processing for each core
t4 = core 0 Loaded with process 3
t5 = core core 1 Free
.... according process 0,1,2,3 takes, in theory the same time on any core

私が得ることなくp.join()

t0 = core 0 Loaded with process 0
t1 = core 1 Loaded with process 1
t2 = core 2 Loaded with process 2
t4 = core 0 Loaded with process 3 // two process on core 0
t5 = core 1 Loaded with process 4 // etc etc ...

私はp.join()得る:

t0 = core 0 Loaded with process 0
t1 = core 0 Free // that is not multiprocessing ...
t2 = core 1 Loaded with process 1
t3 = core 1 Free
t4 = core 2 Loaded with process 2
t5 = core 2 Free

私はif !p.busy()…のようなものを探しています。目的は、単一プロセスの画像サイズ変更プログラムをマルチプロセスに変換することです。

p.join()から来た

p = Process(target=fonction, args=((process_id),filearg[file],t0))
p.start()
p.join()
4

1 に答える 1

2

あなたが求めるものは不可能です。Python とそのモジュールはスケジューリングを処理しません。それは完全にOS次第です。OS が特定のプロセスにコア X を使用するよりもコア X を使用する方がよいと判断した場合。限目。

最善の方法は、プロセスの CPU アフィニティを変更することです。psutilライブラリ、特に関数を使用してこれを行うことができますset_cpu_affinity

OS とスケジューラ アフィニティによっては、常に適用される場合とそうでない場合があることに注意してください (つまり、何らかの方法でアフィニティを設定することはできますが、OS は状況によってはそれを無視します)。


multiprocessingのインスタンスとのCPU アフィニティを設定するには、次のProcessようにします。

processes = []
for i in range(4):
    p = Process(target=fonction, args=((process_id),filearg[file],t0))
    p.start()
    proc = psutil.Process(p.pid)
    proc.set_cpu_affinity([i])
    processes.append(p)

# Wait for *all* the child processes to terminate.
for p in processes:
    p.join()

CPUが空いているときにプロセスを繰り返し生成したい場合は、次のようにすることができます:

processes = []
for i in range(4):
    p = Process(target=fonction, args=((process_id),filearg[file],t0))
    p.start()
    proc = psutil.Process(p.pid)
    proc.set_cpu_affinity([i])
    processes.append(p)

while True:
    for i, p in enumerate(processes):
        if not p.is_alive():
            # this process finished. Replace with a new one.
            p.join()
            new_p = Process(...)
            new_p.start()
            proc = psutil.Process(new_p.pid)
            proc.set_cpu_affinity([i])
            processes[i] = new_p

この種のコードで少し遊んでみると、ほとんど目的の出力を達成できるはずです。

于 2013-08-27T17:53:14.600 に答える