【Python】複数の関数を順に実行し、任意の時間で処理が終わらなかった場合に後回しにして再実行、終わらないならそのまま永遠ループさせる(デバック場所がわかる)コードサンプル

08_備忘録

import time

def run_function(func_name, timeout):
  start_time = time.time()
  try:
    func_name()
  except Exception as e:
    print(f"関数 {func_name.__name__} でエラーが発生しました: {e}")
    return False
  finally:
    elapsed_time = time.time() - start_time
    print(f"関数 {func_name.__name__} は {elapsed_time:.2f} 秒で実行されました")
  return elapsed_time <= timeout

def main():
  """
  メイン関数
  """
  functions = [
    (function_a, 10),
    (function_b, 11),
    (function_c, 3),
    (function_d, 12),
  ]

  # 処理済み関数を記録するためのリスト
  executed_functions = []

  while True:
    # すべての関数を処理し終えた場合はループを終了
    if len(functions) == len(executed_functions):
      break

    # 未処理の関数から順番に実行
    for func_name, timeout in functions:
      if func_name in executed_functions:
        continue

      # 関数を実行
      if run_function(func_name, timeout):
        # 正常に終了した場合は処理済みリストに追加
        executed_functions.append(func_name)
      else:
        # タイムアウトした場合は、リストの先頭に移動
        functions.insert(0, functions.pop(functions.index((func_name, timeout))))


def function_a():
    time.sleep(10)

def function_b():
    time.sleep(10)

def function_c():
    time.sleep(10)

def function_d():
    time.sleep(10)

if __name__ == "__main__":
  main()

Bardと数回やり取りして作ったコードですが、悪くなかったので備忘録的に残しているだけです。

コメント

タイトルとURLをコピーしました