質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1924閲覧

並列処理内でのデータフレーム格納に失敗するスレッドがある

senisora

総合スコア5

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/01/08 07:05

前提・実現したいこと

pythonを使ってWebAPIの結果(json形式)を1つの行列に追記するシステムを並列処理を使って作っています。

発生している問題

同時実行数を増やした場合に一部の結果が格納されない状況となっております。
正しく全ての処理スレッドで結果を格納するためにはどのように変更すればよいでしょうか。
並列処理を使わない場合や、同時実行数が少ない場合は正しく格納されるため、同時に書き込む際にエラーもしくはプログラム作成としてのご法度があると思われます。
スクリプト単体で動作させたいため、データベース等への格納は考慮していません。

ソースコード

python

1import pandas as pd 2from concurrent import futures 3 4columns = ['column_A','column_B','column_C'] 5df = pd.DataFrame(columns = columns ) 6df_0 = pd.DataFrame([[1,2,3]],columns = columns) 7df_1 = pd.DataFrame([[4,5,6]],columns = columns) 8df_2 = pd.DataFrame([[7,8,9]],columns = columns) 9 10def sample_func(index): 11 global df 12 n = index % 3 13 if n == 0: 14 df = df.append(df_0, ignore_index=True ,sort=False) 15 elif n == 1: 16 df = df.append(df_1, ignore_index=True ,sort=False) 17 else: 18 df = df.append(df_2, ignore_index=True ,sort=False) 19 20def main(): 21 future_list = [] 22 with futures.ThreadPoolExecutor(max_workers=10) as executor: 23 for index in range(30): 24 future = executor.submit(fn=sample_func, index=index) 25 future_list.append(future) 26 _ = futures.as_completed(fs=future_list) 27 print(df) 28 29if __name__ == "__main__": 30 main()

補足情報

Pythonのバージョン:3.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

きちんと排他処理を行いましょう

Python

1import threading 2lock = threading.Lock() 3def sample_func(index): 4 global df 5 n = index % 3 6 if n == 0: 7 with lock: 8 df = df.append(df_0, ignore_index=True ,sort=False) 9 elif n == 1: 10 with lock: 11 df = df.append(df_1, ignore_index=True ,sort=False) 12 else: 13 with lock: 14 df = df.append(df_2, ignore_index=True ,sort=False)

投稿2020/01/08 08:04

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

senisora

2020/01/08 09:01

ありがとうございます。 本番のプログラムでも正常にデータ格納することができました。 初歩だと思いますので、頂いたキーワードを元によく復習します……。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問