Giới hạn Python

Trong bài viết này, tôi sẽ hướng dẫn bạn cách tạo một trình trang trí để giới hạn thời gian thực thi của một hàm trong chương trình Python của bạn thông qua đa xử lý. Động lực chính của tôi để xây dựng trình trang trí này là giới hạn thời gian thực thi các hàm Python bằng một cú pháp đơn giản và các phụ thuộc tối thiểu

Một cách tiếp cận ngây thơ là sử dụng bộ đếm thời gian bên trong hàm Python, kiểm tra định kỳ xem hàm Python đang thực thi có vượt quá giới hạn đó không, rồi thoát. Cách tiếp cận đó có thể phù hợp với giải pháp một lần đơn giản, nhưng bất kỳ cuộc gọi nào đến thư viện của bên thứ ba sẽ ngăn việc kiểm tra giới hạn thời gian

Tôi cũng muốn một giải pháp kín đáo nhất có thể và có thể áp dụng dễ dàng trong toàn bộ cơ sở mã. Decorators cung cấp cú pháp đẹp và trừu tượng để đạt được mục tiêu này

Với suy nghĩ đó, tôi biết mình muốn tạo một công cụ trang trí có thể gắn vào bất kỳ chức năng nào trong dự án của mình. Trình trang trí sẽ xử lý việc giới hạn thời gian thực hiện của chức năng ở một số lượng được chỉ định. Tôi cũng muốn giữ mọi thứ hoàn toàn bằng Python để hạn chế sự phụ thuộc/độ phức tạp của việc thêm loại bộ lập lịch này

Những thách thức chính của việc này là

  1. Trình trang trí nên lấy một tham số cho thời gian thực hiện tối đa để dễ dàng mở rộng
  2. Các chức năng được trang trí có thể có đầu vào/đầu ra tùy ý
  3. Bộ đếm thời gian sẽ hoạt động ngay cả khi chức năng thực thi thực hiện cuộc gọi đến thư viện của bên thứ ba

Để bắt đầu, tôi cần tạo một trình trang trí có thể lấy tham số làm đối số. Sau một số nghiên cứu, tôi đã tìm thấy một chủ đề tràn ngăn xếp tuyệt vời nơi mọi người đề xuất một số giải pháp

Tôi đã làm theo kiến ​​trúc được đưa ra trong một bài đăng của Peter Mortensen trong các bình luận để tạo ra một công cụ trang trí cho những người trang trí. Tôi sẽ không đi sâu vào cách thức hoạt động của nó, nhưng bạn có thể nhảy vào chủ đề để được giải thích chi tiết hơn. Để biết thêm thông tin về người trang trí, tôi thường vào đây để xem lại

Sau đó, bạn có thể đính kèm trình trang trí này vào trình trang trí mà bạn muốn áp dụng cho chức năng của mình, cho phép bạn tham số hóa trình trang trí đó. Tôi muốn tạo một trình trang trí run_with_timer lấy thời gian thực hiện tối đa làm tham số. Nó trông như thế này

Tiếp theo, chúng ta có thể điền mã để giới hạn thời gian thực hiện. Logic như sau; . Quá trình chính sẽ đặt bộ hẹn giờ và hủy quy trình con đang thực thi chức năng nếu nó vượt quá bộ hẹn giờ

Mã để thiết lập đa xử lý gồm hai phần. Đầu tiên là một hàm mà tôi gọi là function_runner, nó hoạt động như một trình bao bọc chạy trong tiến trình mới để xử lý việc chạy hàm Python và trả về kết quả mà hàm đa xử lý có thể xử lý. Thứ hai là mã đa xử lý sinh ra quy trình mới, đặt bộ đếm thời gian, sau đó giết quy trình đã sinh ra nếu nó không hoàn thành đúng lúc

Cuối cùng, tôi có thể tạo chức năng để bọc bằng trình trang trí run_with_timer của mình. Tôi sẽ gọi nó là gấu ngủ

Khi chúng ta chạy hàm sleep_bear, nó sẽ kết thúc nếu vượt quá giới hạn thời gian được đặt trong tham số trang trí. Nếu hàm Python kết thúc trước thời hạn, trình xử lý send_end sẽ trả về kết quả

sleeping_bear["Grizzly", hibernation=10]>> Grizzly is going to hibernate
>> 0 zZZ
>> 1 zZZzZZ
>> 2 zZZzZZzZZ
>> 3 zZZzZZzZZzZZ
>> 4 zZZzZZzZZzZZzZZ
>>
>> TimeExceededException: Exceeded Execution Time
sleeping_bear["Grizzly", hibernation=2]>> Grizzly is going to hibernate
>> 0 zZZ
>> 1 zZZzZZ
>>
>> "Grizzly is waking up!"

Tóm lại, tôi đã chỉ cho bạn cách tạo một trình trang trí để giới hạn thời gian thực hiện các hàm Python bằng cách sử dụng đa xử lý làm trình lập lịch biểu. Tôi đã có thể giải quyết ba vấn đề chính

  1. Tạo một trình trang trí được tham số hóa để giới hạn thời gian thực hiện tối đa
  2. Cho phép các tham số đầu vào tùy ý cho các hàm Python được bao bọc
  3. Giới hạn thời gian thực hiện cho bất kỳ chức năng nào bằng cách tận dụng bộ lập lịch cấp hệ thống trong mô-đun đa xử lý

Như một phần thưởng, tất cả đều được thực hiện với Python và không có sự phụ thuộc của bên thứ ba. Có một số chi phí để khởi chạy đa xử lý, nhưng mục tiêu của tôi là hạn chế các chức năng chạy lâu hơn, vì vậy đây không phải là công cụ giảm giá

Nếu bạn thích điều này, hãy nhớ theo dõi tôi để hỗ trợ nhiều nội dung như thế này trong tương lai. Cảm ơn bạn đã đọc, và như mọi khi, nếu bạn có bất kỳ đề xuất hoặc phản hồi nào, vui lòng cho tôi biết trong phần nhận xét

giới hạn là một thư viện python để thực hiện giới hạn tốc độ với các phụ trợ lưu trữ thường được sử dụng [Redis, Memcached & MongoDB]

Được tài trợ bởi Zuplo - nền tảng Quản lý API có thể lập trình, được quản lý hoàn toàn. Thêm giới hạn tốc độ và hơn thế nữa vào API công khai của bạn sau vài phút, hãy dùng thử tại zuplo. com

Lặn ngay trong

Khởi tạo phụ trợ lưu trữ

from limits import storage
memory_storage = storage.MemoryStorage[]
# or memcached
memcached_storage = storage.MemcachedStorage["memcached://localhost:11211"]
# or redis
redis_storage = storage.RedisStorage["redis://localhost:6379"]
# or leave it to fate
some_storage = storage.storage.from_string[fate]

Khởi tạo bộ giới hạn tốc độ với Chiến lược cửa sổ di chuyển

from limits import strategies
moving_window = strategies.MovingWindowRateLimiter[memory_storage]

Khởi tạo giới hạn tốc độ

from limits import parse
one_per_minute = parse["1/minute"]

Khởi tạo giới hạn tốc độ một cách rõ ràng

from limits import RateLimitItemPerSecond
one_per_second = RateLimitItemPerSecond[1, 1]

Kiểm tra các giới hạn

assert True == moving_window.hit[one_per_minute, "test_namespace", "foo"]
assert False == moving_window.hit[one_per_minute, "test_namespace", "foo"]
assert True == moving_window.hit[one_per_minute, "test_namespace", "bar"]

assert True == moving_window.hit[one_per_second, "test_namespace", "foo"]
assert False == moving_window.hit[one_per_second, "test_namespace", "foo"]
time.sleep[1]
assert True == moving_window.hit[one_per_second, "test_namespace", "foo"]

Kiểm tra các giới hạn cụ thể mà không cần nhấn chúng

assert True == moving_window.hit[one_per_second, "test_namespace", "foo"]
while not moving_window.test[one_per_second, "test_namespace", "foo"]:
    time.sleep[0.01]
assert True == moving_window.hit[one_per_second, "test_namespace", "foo"]

Chủ Đề