[解決済み] 複数のプロセスから共有カウンタをインクリメントするには?
2023-04-05 23:31:51
質問
私は
multiprocessing
モジュールに問題があります。私は
Pool
を持つワーカーの
map
メソッドを使って、たくさんのファイルを同時に分析することができます。ファイルが処理されるたびにカウンタが更新され、あと何ファイル処理できるかを追跡できるようにしたいと思います。以下はサンプルコードです。
import os
import multiprocessing
counter = 0
def analyze(file):
# Analyze the file.
global counter
counter += 1
print counter
if __name__ == '__main__':
files = os.listdir('/some/directory')
pool = multiprocessing.Pool(4)
pool.map(analyze, files)
これに対する解決策が見当たりません。
どのように解決するのですか?
問題は
counter
変数がプロセス間で共有されていないことです。各個別のプロセスがそれ自身のローカルインスタンスを作成し、それをインクリメントしています。
参照
このセクション
を参照してください。 あなたの場合、プロセス間で状態を共有するために
Value
のインスタンスをワーカー間で共有したいかもしれません。
この例の作業バージョンです (いくつかのダミー入力データ付き)。 グローバルな値を使用していますが、これは実際には避けたいことです。
from multiprocessing import Pool, Value
from time import sleep
counter = None
def init(args):
''' store the counter for later use '''
global counter
counter = args
def analyze_data(args):
''' increment the global counter, do something with the input '''
global counter
# += operation is not atomic, so we need to get a lock:
with counter.get_lock():
counter.value += 1
print counter.value
return args * 10
if __name__ == '__main__':
#inputs = os.listdir(some_directory)
#
# initialize a cross-process counter and the input lists
#
counter = Value('i', 0)
inputs = [1, 2, 3, 4]
#
# create the pool of workers, ensuring each one receives the counter
# as it starts.
#
p = Pool(initializer = init, initargs = (counter, ))
i = p.map_async(analyze_data, inputs, chunksize = 1)
i.wait()
print i.get()
関連
-
[解決済み] マルチプロセシングpool.mapを複数の引数で使用する方法
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] 文字列から空白を取り除くには?
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】マルチプロセッシングの Pool.map() で <type 'instancemethod'> を pickle できない。)
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] Django filter queryset __in for *every* item in list