🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
並列処理

複数の計算が同時に実行される手法

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1460閲覧

pythonでエラーが起きたときに中断する方法について

pokemonta

総合スコア170

並列処理

複数の計算が同時に実行される手法

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/08 02:02

編集2021/03/08 03:33

mainで受け取ったItems(人の名前のリスト)を
マルチスレッドで並列化しその人の詳細情報を取得するプログラムを作っています。

10人リストを渡した時に詳細情報が存在しない場合に
処理を中断することを考えているのですがsubmain()にbreakを置いたことで
以下のプログラムではエラーが発生します。
'break' outside loop

breakはループの中(for)でおくべきものなので当然ですが。。
どのように対処すればよいでしょうか?

python

1def main(Items): 2 mult = ThreadPoolExecutor(max_workers=10, thread_name_prefix="thread") 3 for Item in Items: 4 mult .submit(submain,Item) 5 mult.shutdown() 6 7def submain(Item): 8 try: 9 result = get_attr(Item) 10 except KeyError as ex: 11     SetErrorMassage('Error001') 12 break 13 dict = {'name':result['name']} 14 15dictRes = dict() 16if dict is not None: 17  return dict 18else 19 dictRes = GetErrorMassage() 20 return dictRes

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

非同期処理なのですね。
for文の実行中にエラーが起きるかもしれないし、mult.shutdown()で全ての終了を待っている間にエラーが起きるかもしれないので、全てをtry節に入れましょう。

ただ、resultを使っていないので、これをどうにかしないと役に立たないと思います。外部変数の配列に入れるとかしないと結果を使えないからです。

python

1def main(Items): 2 mult = ThreadPoolExecutor(max_workers=10, thread_name_prefix="thread") 3 try: 4    for Item in Items: 5    mult .submit(submain,Item) 6 mult.shutdown(wait=True) 7 except KeyError as ex: 8 print(ex) 9 exit(-1) 10 11def submain(Item): 12 result = get_attr(Item)

これでエラーを拾っても、残っているスレッドで別のエラーが起きると、try節の外でエラーを受け取って落ちるので、exitさせています。
これがいやなら、全てのスレッドを別の方法で殺す必要があります。

投稿2021/03/08 02:37

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pokemonta

2021/03/08 03:24

exit(-1)しかdefを抜ける(中断する)方法ありませんか?
ppaul

2021/03/08 03:29

抜けたいだけならreturnしてもいいのですが、そのあとでも子スレッドが異常を起こして、tryでは拾えないためにトレースを出して止まるということです。 回答に書きましたように、そのあとも処理を続けたいなら、workerのスレッドを全部止めないといけないということです。
guest

0

処理を中断ということは、エラーで停止させてはいかがですか?
要するに、try&except文を消すまたは、except文の中にraise文を入れて、エラーを起こすでどうでしょう。
すると、mult.submit(省略)の返り値done?をみれば、まあダイジョブではないでしょうか。
それか、returnでエラー値を返しておくのもいいかもしれません。
returnのあとは、すべて無視されます。(関数内で)

投稿2021/03/08 02:25

Marusoftware

総合スコア189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

submain関数で、情報が存在してるときはtrue、存在しない場合(エラーが出る場合)はfalseを返しておくようにしておいて、
呼び出し側で、その関数からfalseが帰ってきたときにbreakを実行するようにしておけばいいです

投稿2021/03/08 02:18

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問