[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](/media/filer_public_thumbnails/filer_public/5a/7b/5a7b20f3-880f-4589-bfc8-2d9010a5540a/python_decorator_-_timeout.png__1500x900_crop_subsampling-2_upscale.png)
![[Python Decorators] Timeout](/media/filer_public_thumbnails/filer_public/5a/7b/5a7b20f3-880f-4589-bfc8-2d9010a5540a/python_decorator_-_timeout.png__400x240_crop_subsampling-2_upscale.png)
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
- 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.
- 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ổ.
- 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ụngsignal
.
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.