1
import threading 
import multiprocessing.dummy as mt 
import numpy as np 


if __name__ == '__main__': 
    n = 6 
    a = np.zeros((n, n)) 

    def f(i, j): 
     a[i, j] = i + j 

    with mt.Pool() as pool: 
     r = pool.starmap_async(f, ((i, j) for i in range(n) for j in range(n))) 

    r.wait() 
    print(a) 

上記スニペットは、r.wait()でブロックされます。`Pool。* _ async`関数は決して準備ができません

import threading 
import multiprocessing.dummy as mt 
import numpy as np 


if __name__ == '__main__': 
    n = 6 
    a = np.zeros((n, n)) 

    def f(i, j): 
     a[i, j] = i + j 

    with mt.Pool() as pool: 
     pool.starmap(f, ((i, j) for i in range(n) for j in range(n))) 

    print(a) 

にそれを変更した場合でも、aの内容をすぐに印刷されます。では、最初のスニペットのrが決して準備ができていないのはなぜですか? (Pythonバージョン:Python 3.6.2 :: Anaconda custom (64-bit)、Linux)

答えて

2

問題は、あなたがwithブロックの外で待っているということです。 withブロックを終了するとすぐに、プールはterminatedになり、タスクは完了しません。 javadocsから:

プールオブジェクトは、コンテキスト管理プロトコルをサポートするようになりました。コンテキストマネージャの種類を参照してください。 __enter__()はプールオブジェクトを返し、__exit__()terminate()を呼び出します。

...

terminate()

優れた作品を完了せずに、すぐにワーカープロセスを停止します。プールオブジェクトがガベージコレクトされると、すぐに呼び出されます。 terminate()

withブロック内のr.wait()への呼び出しを移動すると、問題が修正されます。

関連する問題