[解決済み] 終了までに時間がかかりすぎる場合のタイムアウト機能【重複】について
2022-03-03 15:07:42
質問
私は、訪問してスクリーンショットを撮りたいURLを含むテキストファイルをループするシェルスクリプトを持っています。
これだけのことで、シンプルにできています。スクリプトはクラスを初期化し、それを実行するとリスト内の各サイトのスクリーンショットが作成されます。サイトによっては、読み込みに非常に長い時間がかかるものや、まったく読み込まれないものもある。そこで、スクリーングラバーファンクションをタイムアウトスクリプトでラップし、ファンクションが以下を返すようにしたい。
False
10秒以内に終了しなかった場合。
できるだけシンプルな解決策に満足しています。非同期タイマーを設定して、関数内で実際に何が起こっても、10秒後にFalseを返すようにするとか?
どのように解決するのですか?
のドキュメントに、操作をタイムアウトさせる手順が記載されています。 シグナル .
基本的な考え方は、シグナルハンドラを使用して、ある時間間隔のアラームを設定し、そのタイマーが切れた時点で例外を発生させるというものです。
なお、これはUNIX上でしか動作しません。
ここでは、デコレータを作成する実装を紹介します (次のコードを
timeout.py
).
import errno
import os
import signal
import functools
class TimeoutError(Exception):
pass
def timeout(seconds=10, error_message=os.strerror(errno.ETIME)):
def decorator(func):
def _handle_timeout(signum, frame):
raise TimeoutError(error_message)
@functools.wraps(func)
def wrapper(*args, **kwargs):
signal.signal(signal.SIGALRM, _handle_timeout)
signal.alarm(seconds)
try:
result = func(*args, **kwargs)
finally:
signal.alarm(0)
return result
return wrapper
return decorator
というデコレータが作成されます。
@timeout
これは、長く実行される関数に適用することができます。
つまり、アプリケーション・コードでは、このようなデコレータを使うことができるわけです。
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1():
...
# Timeout after 5 seconds
@timeout(5)
def long_running_function2():
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout(30, os.strerror(errno.ETIMEDOUT))
def long_running_function3():
...
関連
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] 関数呼び出し時のタイムアウト
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python カメの描画コマンドとその例
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] 関数呼び出し時のタイムアウト
-
[解決済み】pythonのrequests.get entire responseのタイムアウトについて