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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

1173閲覧

pythonの並列処理について

alfald

総合スコア19

並列処理

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

Python 3.x

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

0グッド

0クリップ

投稿2021/12/09 06:36

編集2021/12/09 06:57

疑問点

pythonで並列処理を行いたいが、並列処理を行ってくれるコードの違いが分かりません。
ThreadPoolExecutorを使用した関数の返り値の取得によって並列処理を行ってくれません。

公式では、.result()を使用しているので、使用してましたが、並列処理を行っているように思えませんでした。

該当のソースコード

取得したい値はdict_outputです。

python

1from concurrent import futures 2import time 3import random 4 5 6def sample_func(index,key_a): 7 print('index: %s started.' % index) 8 sleep_seconds = random.randint(2, 4) 9 time.sleep(sleep_seconds) 10 print('index: %s ended.' % index) 11 dict_a[key_a]=index 12 return dict_a 13 14future_list = [] 15dict_a={} 16dict_output={} 17dict_range={'key1':1,'key2':2,'key3':3,'key4':4,'key5':5,'key6':6,'key7':7,'key8':8,'key9':9,'key10':10,'key11':11,'key12':12,'key13':13,'key14':14, 18 'key15':15,'key16':16,'key17':17,'key18':18,'key19':19,'key20':20} 19with futures.ThreadPoolExecutor(max_workers=4) as executor: 20 for key_a,i in dict_range.items(): 21 future = executor.submit(sample_func, index=i,key_a=key_a) 22 future_list.append(future) 23 dict_output[i]=future.result() #この行を消すと並列実行を行ってくれる 24 _ = futures.as_completed(fs=future_list) 25 26print('completed.') 27print(dict_a) 28print(dict_output)

並列処理を行うために.result()を削除した場合は、以下になります。

python

1from concurrent import futures 2import time 3import random 4 5 6def sample_func(index,key_a,dict_output): 7 print('index: %s started.' % index) 8 sleep_seconds = random.randint(2, 4) 9 time.sleep(sleep_seconds) 10 print('index: %s ended.' % index) 11 dict_a[key_a]=index 12 dict_output[index]=dict_a 13 return dict_output 14 15future_list = [] 16dict_a={} 17dict_output={} 18dict_range={'key1':1,'key2':2,'key3':3,'key4':4,'key5':5,'key6':6,'key7':7,'key8':8,'key9':9,'key10':10,'key11':11,'key12':12,'key13':13,'key14':14, 19 'key15':15,'key16':16,'key17':17,'key18':18,'key19':19,'key20':20} 20with futures.ThreadPoolExecutor(max_workers=4) as executor: 21 for key_a,i in dict_range.items(): 22 future = executor.submit(sample_func, index=i,key_a=key_a,dict_output=dict_output) 23 future_list.append(future) 24 _ = futures.as_completed(fs=future_list) 25 26print('completed.') 27print(dict_a) 28print(dict_output)

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

alfald

2021/12/09 06:53

>b_list の定義がない... すみません 消し忘れでした。 はいそうです。 他の例でも値を返すものは基本的に".result()"を使用しているみたいなので
guest

回答1

0

ベストアンサー

Featuor.result()は、生成したプロセス/スレッドの終了を待つものですので、submitしたループの後で実行してしまうと、そのループごとに終了を待っつしまい、並列処理になりません。

そのループの中でresult()を取るのでなく、ループの外で取出すようにすればいいいでしょう。

python

1for f in future_list: 2 dict_output[i]=f.result()

投稿2021/12/09 07:20

TakaiY

総合スコア12657

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

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

alfald

2021/12/09 23:45

ありがとうございます。 上記のように行えば動きました。 result()にはそのような処理が挟まっていたのですね。 参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問