私はPythonのmultiprocessingモジュールと共有メモリで遊んでいます。 Process
で共有メモリオブジェクトを使用できますが、Pool
では使用できません。 Pool
のコールバックを追加しましたが、コールバックが呼び出されないようです。プールを使用して共有メモリオブジェクトを変更できません
from multiprocessing import Array, Pool, Process
def flip(x,a):
a[x] = 0 if a[x] else 1
return (x, a[x])
def cb(result):
print(result)
if __name__ == '__main__':
# size of array
N = 10
# shared array - N bytes - unsynchronized - initialized to zeros
a = Array('B', N, lock=False)
# flip values to ones using Process
processes = [Process(target=flip, args=(x, a)) for x in range(N)]
for p in processes: p.start()
for p in processes: p.join()
print([a[i] for i in range(N)])
# flip values back to zeros using Pool
pool = Pool(processes=4)
for x in range(N):
pool.apply_async(flip, args=(x, a), callback=cb)
pool.close()
pool.join()
print([a[i] for i in range(N)])
私は私の共有配列はすべて1の、単一callback
によって印刷された線とすべて0で再び配列が続くと、一度印刷し得ることを期待し、代わりにこれを得るだろう。
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Pool
がタスクを実行していないのはなぜですか?
最小限の例のために、共有メモリの取り出し。
def f(x):
return x
def cb(result):
print('cb',result)
if __name__ == '__main__':
pool = Pool(processes=4)
pool.apply_async(f, range(10), callback=cb)
pool.close()
pool.join()
これは、0から9までの数字を別々の行に出力すると思いますが、何も出力しません。
すぐに上記のapply_sync
コールを置き換えると、
pool.apply_async(f, args=[10], callback=cb)
私は出力range(10)
と[10]
、[1,2,3]
、[(1),(2),(3)]
、または([1],[2],[3])
何も出力が得られないの交換
cb 10
を取得します。
xの範囲(N):pool.apply .... flipを4回適用していますか? 1 - 0 - 1 - 0 - 1(1で終わり) – chapelo
@chapelo - 4はプール内の作業者の数です。 'のための'はそれらのために10のタスクを作成する必要があります。 'cb'は決して呼び出されないので、どのタスクも実行されていないようです。 – CAB
プールは自動的にワーカー間の作業を分割しますが、間違ってargsを渡しています – Aaron