[解決済み] Pythonのマルチプロセッシングで安全にファイルに書き込む
2023-02-03 11:21:51
質問
私は多くのサブ問題を含む大きな数値問題を解決しようとしています。私は異なる独立したサブ問題を異なるコアに分割するためにPythonのマルチプロセッシングモジュール(特にPool.map)を使用しています。各サブ問題は多くのサブ問題の計算を含み、私はこれらの結果を、まだどのプロセスによっても計算されていない場合はファイルに保存し、そうでない場合は計算をスキップしてファイルから結果だけを読み取ることによって、効果的にメモ化しようと試みています。
異なるプロセスが、サブサブ問題がまだ計算されていないかどうか (結果が格納されるファイルを探すことによって) チェックし、まだ計算されていないことを確認し、計算を実行し、そして同時に同じファイルに結果を書き込もうとすることがあります。このような書き込みの衝突を避けるにはどうしたらよいでしょうか?
どのように解決するのですか?
GP89 が良い解決策を挙げています。キューを使用して、ファイルへの単独書き込みアクセス権を持つ専用のプロセスに書き込みタスクを送信します。他のすべてのワーカーは読み取り専用アクセス権を持っています。これにより、衝突をなくすことができます。 以下は apply_async を使用した例ですが、map でも動作します。
import multiprocessing as mp
import time
fn = 'c:/temp/temp.txt'
def worker(arg, q):
'''stupidly simulates long running process'''
start = time.clock()
s = 'this is a test'
txt = s
for i in range(200000):
txt += s
done = time.clock() - start
with open(fn, 'rb') as f:
size = len(f.read())
res = 'Process' + str(arg), str(size), done
q.put(res)
return res
def listener(q):
'''listens for messages on the q, writes to file. '''
with open(fn, 'w') as f:
while 1:
m = q.get()
if m == 'kill':
f.write('killed')
break
f.write(str(m) + '\n')
f.flush()
def main():
#must use Manager queue here, or will not work
manager = mp.Manager()
q = manager.Queue()
pool = mp.Pool(mp.cpu_count() + 2)
#put listener to work first
watcher = pool.apply_async(listener, (q,))
#fire off workers
jobs = []
for i in range(80):
job = pool.apply_async(worker, (i, q))
jobs.append(job)
# collect results from the workers through the pool result queue
for job in jobs:
job.get()
#now we are done, kill the listener
q.put('kill')
pool.close()
pool.join()
if __name__ == "__main__":
main()
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複