したかったこと
n秒遅らせた非同期処理を書きたかった。
こんなコードがあったときに、move_file()をn秒遅らせて非同期で実行したかった。
def move_file(filename):
# ファイル移動
print(f"{filename} を移動しました")
filename = "example.txt"
move_file(filename)
print("その他の処理")
実装
import threading
import time
def move_file(filename):
# ファイル移動
print(f"{filename} を移動しました")
def delayed_move_file(filename, seconds):
print("遅延前")
time.sleep(seconds) # n秒遅延
move_file(filename)
# スレッドを作成して遅延関数を起動
seconds = 3
filename = "example.txt"
thread = threading.Thread(target=delayed_move_file, args=(filename, seconds))
thread.start()
できた。
できたけど、元々のコードへの変更箇所が多すぎる。
デコレータを用いた方法
デコレータの定義
import threading
import time
from functools import wraps
def delay(seconds):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
def delayed():
time.sleep(seconds)
func(*args, **kwargs)
thread = threading.Thread(target=delayed)
thread.start()
return wrapper
return decorator
@delay(seconds=3) # 元のロジックにはこれをつけるだけ
def move_file(filename):
# ここでファイル移動のロジックを書く
print(f"{filename} を移動しました")
filename = "example.txt"
move_file(filename)
print("その他の処理")
元のロジック部分をいじらず、遅延非同期実行に成功。