[Trình Trang Trí Python] Hạn Thời Gian

By hientd, at: 15:28 Ngày 11 tháng 11 năm 2022

Thời gian đọc ước tính: __READING_TIME__ minutes

[Python Decorators] Timeout
[Python Decorators] Timeout

Trình trang trí timeout trong Python được sử dụng để giới hạn thời gian thực thi của một hàm. Nếu hàm chạy lâu hơn thời gian đã chỉ định, nó sẽ gây ra một TimeoutException. Điều này đặc biệt hữu ích trong các trường hợp bạn muốn đảm bảo rằng một hàm không bị treo vô thời hạn.

 

Mã Nguồn

 

import signal

 

class TimeoutException(Exception):
    pass

 

def timeout(seconds):
    def decorator(func):
        def handler(signum, frame):
            raise TimeoutException(f"Function {func.__name__} timed out after {seconds} seconds")

        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, handler)
            signal.alarm(seconds)
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result

        return wrapper
    return decorator

@timeout(5)
def long_running_function():
    import time
    time.sleep(10)

try:
    long_running_function()
except TimeoutException as e:
    print(e)  # Output: Function long_running_function timed out after 5 seconds

 

Giải thích

 

  1. Xử lý tín hiệu: Mô-đun signal được sử dụng để đặt một tín hiệu báo thức kích hoạt sau thời gian đã chỉ định.

     
  2. TimeoutException: Một ngoại lệ tùy chỉnh được phát sinh khi hàm vượt quá thời gian được phân bổ.

     
  3. Cấu trúc trình trang trí: Trình trang trí timeout gói hàm đích và quản lý logic thời gian bằng cách sử dụng signal.

 

Trường hợp sử dụng

 

  • Yêu cầu mạng: Giới hạn thời gian chờ phản hồi mạng.
     
  • Tính toán dài: Ngăn chặn các hàm tốn nhiều tài nguyên tính toán chạy vô thời hạn.
     
  • Quản lý tài nguyên: Đảm bảo các hàm truy cập vào các tài nguyên hạn chế không độc chiếm chúng.

 

Hạn chế

 

  • Phụ thuộc nền tảng: Mô-đun signal chỉ hoạt động trên các hệ thống dựa trên Unix. => Để tránh điều đó, chúng ta có thể sử dụng một số dịch vụ công cộng, ví dụ: Sentry để thông báo lỗi

     
  • An toàn luồng: Không phù hợp với các ứng dụng đa luồng, vì tín hiệu là toàn bộ quy trình.

 

Bằng cách tích hợp trình trang trí timeout, bạn có thể làm cho chương trình của mình mạnh mẽ hơn và ngăn ngừa các sự cố treo do các hàm chạy lâu.

Tag list:
- Decorator
- Function Decorator
- Time It Decorator
- decorator best practices
- Python decorators

Liên quan

Python

Đọc thêm
Python

Đọc thêm

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.