
下記のプログラムで、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ランキング
-
内部処理形式が日付型 (Date) ...
-
Pythonのプログラミングの質問...
-
Application.ScreenUpdating = ...
-
VB6で、長い時間かかる処理...
-
セレクトボックスのselected属...
-
テーブル内でドロップダウンメ...
-
16進の10進変換について
-
FindFirst を複数条件で検索
-
メモリをアドレスを直接指定し...
-
シェルスクリプトで、空白(ス...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
-
<SELECT>タグの折り返し
-
【至急!!!】python言語で本を見...
-
複数列を持ったリストボックス...
-
セレクトメニューで2つの項目...
-
実行時エラー 3020の対策
-
ソケットでのデータ送受信につ...
-
vbaでxmlからNodeListでデータ...
-
半角スペースが有効にならない。
マンスリーランキングこのカテゴリの人気マンスリー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())
みたいな書き方でいいんですかね?