疑問点
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー