
下記のプログラムで、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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- 英語 【 英コミ Amから始まる疑問文 】 問題 Our belongings are the resul 1 2022/07/24 11:52
- 英語 この英文の一部が分かりません。 7 2023/04/16 10:39
- 英語 What are your future plans? の返し方で My future plan i 3 2022/06/09 12:00
- 英語 you gotta trust what’s gonna happen in the future 1 2022/11/12 10:18
- 英語 どういう意味? アメリカ人男性とメールしていて、彼は手作りのパンケーキの写真を送ってきて、美味しそう 8 2023/08/21 22:06
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- その他(プログラミング・Web制作) このpythonコードの意味教えて下さい! 2 2022/08/26 00:52
- 英語 とあるTOEIC教材の文章の構文で教えて頂きたいです 3 2022/05/03 04:06
- 英語 この英語はどんなことを意味していますか? 3 2022/06/29 08:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CGI初心者です
-
Pythonのマルチプロセスでの並...
-
Perl 一定時間後にプログラムを...
-
プロトタイプ宣言のワーニング...
-
Perlでsub a($)のように$をつけ...
-
Pythonのプログラミングの質問...
-
LISPで連想配列の操作?
-
Perlで自分自身の関数名を知る...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
メモリをアドレスを直接指定し...
-
<SELECT>タグの折り返し
-
実行時エラー 3020の対策
-
【至急!!!】python言語で本を見...
-
文字の横にプルダウンを表示さ...
-
Pythonでコンソールをクリアす...
-
セレクトメニューで2つの項目...
-
sendmailで複数の宛先にメール...
-
子windowsからsubmit()後にclos...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プロトタイプ宣言のワーニング...
-
これは動いてくれますか??
-
Perlで複数の値を返す良い方法...
-
CGIから複数の別プログラムを同...
-
Rubyのgets関数について
-
dieやPerl自体でエラーが発生し...
-
Perl:計算誤差について
-
HASH(0xほげほげ)
-
内部処理形式が日付型 (Date) ...
-
引数の値をURLのパスに配列とし...
-
Perlで足し算をするには
-
Perlで自分自身の関数名を知る...
-
perlでテキスト複数行を関連付...
-
print <<"_HTML_"の中でサブル...
-
なんで?
-
Net::Telnetでタイムアウト時間...
-
foreach 回数制限
-
Pythonのマルチプロセスでの並...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
おすすめ情報
ごめんなさい。問題の個所は、
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())
みたいな書き方でいいんですかね?