
下記のプログラムで、future1、future2、future3の処理はマルチプロセスになると思うのですが、その下のprint文の実行もマルチプロセスになるのでしょうか。例えばfuture2の処理がfuture1よりはやく終わった場合、print(future2.result())が最初に実行されるのでしょうか?それともfuture1の処理の終了を待って、print(future1.result())が実行された後で、print(future2.result())が実行されるのでしょうか?
from concurrent import futures
def top_word(path):
with open(path) as f:
str = f.read()
word_counts = {}
for s in str.split():
if s not in word_counts:
word_counts[s] = 0
word_counts[s] += 1
top = sorted(word_counts.items(), key=lambda v:v[1])[-1]
return top
def main():
with futures.ProcessPoolExecutor() as executor:
future1 = executor.submit(top_word, "./big_file1.txt")
future2 = executor.submit(top_word, "./big_file2.txt")
future3 = executor.submit(top_word, "./big_file3.txt")
print(future1.result())
print(future2.result())
print(future3.result())
if __name__ == "__main__":
main()
No.1ベストアンサー
- 回答日時:
この書き方だとfuture1.result()はfuture1の完了を待ちますね。
1,2,3の順にしか表示できません。終わった順に結果を表示したいならfutures.wait()をreturn_when=FIRST_COMPLETEDで呼び出すとかして並列待ちして、結果が出たものから表示するようにコードを書く必要があります。
なお、このサイトでPythonのコードを書く場合、行頭の空白が削除されるので全角空白を置くなどしてインデントをみえるようにして下さい。
Pythonはインデントが消えると意味を取ることが困難になりますので。
No.2
- 回答日時:
補足のコードだったら外側のループは for じゃなくて while len(pending) とする方が良いのではないかと思います。
そうでないなら pending が空の時の futures.wait の挙動は要確認です。お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
画像生成AIのプロンプトの作り...
-
Python... 環境設定 初心者です...
-
Python 3.12.2 か一番最新のパ...
-
CSVファイルの複数行削除
-
python3について。
-
初心者powershellのPS1ファイル...
-
【IT導入補助金は個人事業主や...
-
Pythonでの文字列からfloatへの...
-
VBAでパワーシェルを実行したい...
-
Google ColaboでGUI作成
-
Geminiフォーム 画像生成で 人...
-
数学、プログラミング、物理、...
-
pip --versionがエラーになる
-
pythonの実行に関する質問
-
OS入ってる機器のソフト・アプ...
-
パイソンのソースコードをChatG...
-
pythonについて(初心者です)
-
ネットワークフォルダの中身を...
-
MOVEコマンドでサブフォルダー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
何がいけないのでしょうか?
-
プロトタイプ宣言のワーニング...
-
ループで小数を使うと変な誤差が
-
__DATA__ が上書きされてしまう
-
数値の多い順に別々の処理をす...
-
10進数→2進数
-
Perlで複数の値を返す良い方法...
-
入れ子ループで、外側のループ...
-
連想配列とforeach
-
変数内でHTMLを使用したいです
-
print <<"_HTML_"の中でサブル...
-
dieやPerl自体でエラーが発生し...
-
別プログラムの標準入力に引数...
-
掲示板に入力した文を表示する...
-
Perlにfunctionってないんですか?
-
Perlで自分自身の関数名を知る...
-
変数に値を代入するのに、まずu...
-
Telnetモジュールで繋がりません。
-
Pythonのマルチプロセスでの並...
-
1行での計算について
おすすめ情報
ごめんなさい。問題の個所は、
def main():
with futures.ProcessPoolExecutor() as executor:
future1 = executor.submit(top_word, "./big_file1.txt")
future2 = executor.submit(top_word, "./big_file2.txt")
future3 = executor.submit(top_word, "./big_file3.txt")
print(future1.result())
print(future2.result())
print(future3.result())
です。
pending = [future1, future2, future3]
for _ in range(3):
done, pending = futures.wait(pending, return_when=FIRST_COMPLETED)
for p in done:
print(p.result())
みたいな書き方でいいんですかね?