こんにちは、私は現在Pythonでマルチプロセッシングを使用しています。そして、あるタスクの処理が完了したときに各プロセスがインクリメントできる単純なカウンター変数が存在するかどうか疑問に思っています(合計でどれだけの作業が行われたかのようなものです)。
Value の API を調べましたが、可変だとは思わないでください。
こんにちは、私は現在Pythonでマルチプロセッシングを使用しています。そして、あるタスクの処理が完了したときに各プロセスがインクリメントできる単純なカウンター変数が存在するかどうか疑問に思っています(合計でどれだけの作業が行われたかのようなものです)。
Value の API を調べましたが、可変だとは思わないでください。
Value
確かに変更可能です。モジュールから必要なデータ型を指定するctypes
と、それを変更できます。これを示す完全な動作スクリプトを次に示します。
from time import sleep
from ctypes import c_int
from multiprocessing import Value, Lock, Process
counter = Value(c_int) # defaults to 0
counter_lock = Lock()
def increment():
with counter_lock:
counter.value += 1
def do_something():
print("I'm a separate process!")
increment()
Process(target=do_something).start()
sleep(1)
print counter.value # prints 1, because Value is shared and mutable
Value
EDIT:Luperは、値がデフォルトでロックされていることを下のコメントで正しく指摘しています。これは、割り当てが複数の操作で構成されている場合でも (多くの文字である可能性がある文字列の割り当てなど)、この割り当てはアトミックであるという意味で正しいです。ただし、カウンターをインクリメントするときは、私の例で提供されているように、外部ロックが必要です。インクリメントは現在の値をロードしてからインクリメントし、結果をValue
.
したがって、外部ロックがないと、次の状況に陥る可能性があります。
Value
、コンテキスト スイッチが発生します。Value