アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のプログラムで、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()

質問者からの補足コメント

  • ごめんなさい。問題の個所は、

    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())

    です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/01/21 06:47
  • pending = [future1, future2, future3]
    for _ in range(3):
     done, pending = futures.wait(pending, return_when=FIRST_COMPLETED)
     for p in done:
      print(p.result())

    みたいな書き方でいいんですかね?

      補足日時:2022/01/21 11:19

A 回答 (2件)

補足のコードだったら外側のループは for じゃなくて while len(pending) とする方が良いのではないかと思います。

そうでないなら pending が空の時の futures.wait の挙動は要確認です。
    • good
    • 0

この書き方だとfuture1.result()はfuture1の完了を待ちますね。

1,2,3の順にしか表示できません。
終わった順に結果を表示したいならfutures.wait()をreturn_when=FIRST_COMPLETEDで呼び出すとかして並列待ちして、結果が出たものから表示するようにコードを書く必要があります。

なお、このサイトでPythonのコードを書く場合、行頭の空白が削除されるので全角空白を置くなどしてインデントをみえるようにして下さい。
Pythonはインデントが消えると意味を取ることが困難になりますので。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!