質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
並列処理

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

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

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

Q&A

解決済

2回答

3206閲覧

thread内で例外が出た場合にthreadごと例外処理させる方法がわからない

KohnoseLami

総合スコア17

並列処理

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

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

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

0グッド

0クリップ

投稿2020/06/11 16:17

前提・実現したいこと

thread処理内で発生した例外を検知してthreadごと一時停止させたい

発生している問題・エラーメッセージ

except requests.exceptions.ConnectionError: print('接続エラー、待機後再接続します。') logs.append("ERROR"+"\t"+target_url) time.sleep(10) のようにthread内に記述してもsleepされない

該当のソースコード

Python3

1 args = sys.argv 2 if len(args)==2: 3 input_file = args[1] 4 else: 5 input_file ="list.txt" 6 7 keywords_list=["Test"] 8 9 logs= [] 10 urls_404 = [] 11 urls_504 = [] 12 urls_accept = [] 13 14 def check_url(target_url): 15 16 try: 17 req = requests.get(target_url) 18 logs.append(str(req.status_code)+"\t"+target_url) 19 20 if req.status_code == 404: 21 urls_404.append(target_url) 22 23 html = BeautifulSoup(req.text, "html.parser") 24 #print(str(html)) 25 title = html.find("title").text 26 body = html.find("body").text 27 28 for keyword in keywords_list: 29 if keyword in body: 30 urls_accept.append(target_url) 31 break 32 33 elif req.status_code == 504: 34 urls_504.append(target_url) 35 36 elif req.status_code == 200: 37 html = BeautifulSoup(req.text, "html.parser") 38 #print(str(html)) 39 title = html.find("title").text 40 body = html.find("body").text 41 42 for keyword in keywords_list: 43 if keyword in body: 44 urls_accept.append(target_url) 45 break 46 47 except requests.exceptions.ConnectTimeout: 48 print('タイムアウトしました') 49 logs.append("TIMEOUT"+"\t"+target_url) 50 time.sleep(10) 51 52 except requests.exceptions.ConnectionError: 53 print('接続エラー、待機後再接続します。') 54 logs.append("ERROR"+"\t"+target_url) 55 time.sleep(10) 56 57 with open(input_file) as f: 58 urls = f.read().splitlines() 59 60 threads = [] 61 62 for url in urls: 63 thread = Thread(target=check_url, args=(url,)) 64 thread.start() 65 threads.append(thread) 66 67 for thread in threads: 68 thread.join() 69 70 with open("log.txt", "w") as f: 71 f.write("\n".join(logs)) 72 73 with open("404.txt", "w") as f: 74 f.write("\n".join(urls_404)) 75 76 with open("504.txt", "w") as f: 77 f.write("\n".join(urls_504)) 78 79 with open("output.txt", "w") as f: 80 f.write("\n".join(urls_accept))

試したこと

ソースコードに記載してあるようにtime.sleepを例外処理に入れてるんですが止まりません。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

y_waiwai

2020/06/11 23:43

止まらないで、どういう動作となるんでしょうか
KohnoseLami

2020/06/12 04:45

time.sleepを無視してアクセスし続け永遠にrequests.exceptions.ConnectionError:がでてしまいます。 このエラーは10秒ほどアクセスを一時停止させることで回避できるのでこのエラーが出た瞬間にthreadごと処理を一時停止させたいです
guest

回答2

0

ベストアンサー

例外が発生した場合に10秒待って再接続したい、ということであれば関数check_url()をそのように実装するのが良いと思います。

python

1def check_url(target_url, retry=3): 2 for i in range(retry): 3 try: 4 ... 5 return # 正常終了の時は関数を終了 6 except requests.exceptions.ConnectTimeout: 7 print('接続エラー、待機後再接続します。') 8 logs.append("ERROR"+"\t"+target_url) 9 time.sleep(10)

投稿2020/06/12 10:14

編集2020/06/12 10:18
yymmt

総合スコア1615

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

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

0

python

1 for url in urls: 2 thread = Thread(target=check_url, args=(url,)) 3 thread.start() 4 threads.append(thread)

ここでスレッドをurlsの数分だけ同時生成/開始させてるんで、そんだけの数の例外が同時発生するのは当然だと思いますが

投稿2020/06/12 07:03

y_waiwai

総合スコア87749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問