0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonでn秒遅らせて非同期で実行する

Posted at

したかったこと

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("その他の処理")

元のロジック部分をいじらず、遅延非同期実行に成功。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?