Quá trình để thời gian ra một hoạt động được mô tả trong tài liệu cho tín hiệu.
Ý tưởng cơ bản là sử dụng các trình xử lý tín hiệu để đặt báo thức trong một khoảng thời gian và tăng một ngoại lệ một khi bộ đếm thời gian hết hạn.
Lưu ý rằng điều này sẽ chỉ hoạt động trên Unix.
Đây là một triển khai tạo ra một trình trang trí [lưu mã sau là
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1[]:
...
# Timeout after 5 seconds
@timeout[5]
def long_running_function2[]:
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout[30, os.strerror[errno.ETIMEDOUT]]
def long_running_function3[]:
...
3].import errno
import os
import signal
import functools
class TimeoutError[Exception]:
pass
def timeout[seconds=10, error_message=os.strerror[errno.ETIME]]:
def decorator[func]:
def _handle_timeout[signum, frame]:
raise TimeoutError[error_message]
@functools.wraps[func]
def wrapper[*args, **kwargs]:
signal.signal[signal.SIGALRM, _handle_timeout]
signal.alarm[seconds]
try:
result = func[*args, **kwargs]
finally:
signal.alarm[0]
return result
return wrapper
return decorator
Điều này tạo ra một người trang trí gọi là
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1[]:
...
# Timeout after 5 seconds
@timeout[5]
def long_running_function2[]:
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout[30, os.strerror[errno.ETIMEDOUT]]
def long_running_function3[]:
...
4 có thể được áp dụng cho bất kỳ chức năng chạy dài nào.Vì vậy, trong mã ứng dụng của bạn, bạn có thể sử dụng bộ trang trí như vậy:
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1[]:
...
# Timeout after 5 seconds
@timeout[5]
def long_running_function2[]:
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout[30, os.strerror[errno.ETIMEDOUT]]
def long_running_function3[]:
...
Python cho phép bạn xây dựng các quy trình và chức năng chạy dài. Nhưng đôi khi bạn có thể muốn dừng thực thi mã sau một khoảng thời gian nhất định. Nếu bạn đang xây dựng các quy trình chạy dài, nên thêm các cơ chế giống như thời gian chờ để đảm bảo rằng chúng không chạy mãi mãi và tiêu thụ tài nguyên không cần thiết. Trong bài viết này, chúng tôi sẽ học cách dừng mã Python sau một khoảng thời gian nhất định.
Dưới đây là các bước để thiết lập thời gian chờ cho chức năng Python.
1. Nhập thư viện cần thiết
Đầu tiên, chúng tôi nhập các thư viện cần thiết như đa xử lý và thời gian.
import multiprocessing import time
2. Tạo chức năng Python
Tiếp theo, chúng tôi tạo ra một chức năng Python mất nhiều thời gian để hoàn thành.
def foo[n]: for i in range[10000 * n]: print i time.sleep[1]
Các hàm trên về cơ bản in 1 số tuần tự [ví dụ: 0, 1, 2, 3, phạm] cứ sau 1 giây, trong 10000*n giây, trong đó n là đầu vào của người dùng. Vì vậy, phải mất rất nhiều thời gian để hoàn thành, như bạn có thể thấy.
3. Thêm mã thời gian chờ
Tiếp theo, chúng tôi thêm mã để gọi chức năng FOO và thời gian chờ sau 10 giây.
if __name__ == '__main__': # Start foo as a process p = multiprocessing.Process[target=foo, name="Foo", args=[10,]] p.start[] # Wait 10 seconds for foo time.sleep[10] # Terminate foo p.terminate[] # Cleanup p.join[]
Trong mã trên, chúng tôi bắt đầu một quá trình để chạy chức năng FOO và vượt qua đối số = 10. Vì vậy, nó sẽ chạy trong 100.000 giây. Hàm p.start [] sẽ bắt đầu quá trình. Thời gian.Sle ngủ [10] sẽ đợi chức năng FOO chạy trong 10 giây. Sau khi thời gian chờ kết thúc, hàm p.terminate [] sẽ chấm dứt hàm foo. p.join [] được sử dụng để tiếp tục thực hiện luồng chính.
Đây là mã hoàn chỉnh cho tài liệu tham khảo của bạn
#!/usr/bin/env python #test.py import multiprocessing import time def foo[n]: for i in range[10000 * n]: print i time.sleep[1] if __name__ == '__main__': # Start foo as a process p = multiprocessing.Process[target=foo, name="Foo", args=[10,]] p.start[] # Wait 10 seconds for foo time.sleep[10] # Terminate foo p.terminate[] # Cleanup p.join[]
Nếu bạn chạy tập lệnh trên, nó sẽ chạy trong 10 giây và chấm dứt sau đó.
Cũng có những cách khác để làm điều tương tự. Ví dụ: bạn cũng có thể sử dụng mô -đun tín hiệu để thực hiện thời gian chờ cho cuộc gọi chức năng.
Cũng đọc:
Cách chuyển đổi byte thành chuỗi trong Pythonhow để lưu trữ đầu ra của lệnh cắt trong shell varablehow để sử dụng các biến shell trong AWK Scripthow để thiết lập các khóa SSH trong Linuxhow để tạo thư mục lồng nhau trong Python
How to Store Output of Cut Command in Shell
Variable
How to Use Shell Variables in Awk Script
How to Setup SSH Keys in Linux
How to Create Nested Directory in Python
Bài viết liên quan:
- Xây dựng vấn đề
- Dung dịch
- Cài đặt và nhập func_timeout
- Ví dụ giải pháp hướng dẫn
- Chức năng đi qua
- Đối số chức năng
Xây dựng vấn đề
Dung dịch
Cài đặt và nhập func_timeout
Ví dụ giải pháp hướng dẫn
Example:
Chức năng đi qua
def long_function[n]: while True: pass
Đối số chức năng
Giả sử bạn cần gọi một hàm dài có khả năng nhưng bạn chỉ có thể đợi thời gian cố định để chức năng chấm dứt.
Nếu hàm chấm dứt trong khoảng thời gian, bạn sẽ lấy giá trị trả về hàm.
def run_function[f, max_wait, default_value]: pass x = run_function[long_function, 5, 'world'] print[x] # world
Nếu hàm không chấm dứt trong khoảng thời gian, bạn muốn lấy giá trị mặc định [dự phòng].
Với chức năng sau
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1[]:
...
# Timeout after 5 seconds
@timeout[5]
def long_running_function2[]:
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout[30, os.strerror[errno.ETIMEDOUT]]
def long_running_function3[]:
...
5 chạy mãi mãi trong một vòng lặp trong khi vòng lặp:Trong mã chính của bạn, bạn muốn chạy chức năng và chờ một số giây nhất định như được đưa ra bởi biến ____ ____ 16 nhưng không còn nữa.
Dung dịch
Cài đặt và nhập func_timeout
Ví dụ giải pháp hướng dẫn
func_timeout[timeout, func, args=[], kwargs=None]
Chức năng đi qua
Đối số chức năng
Giả sử bạn cần gọi một hàm dài có khả năng nhưng bạn chỉ có thể đợi thời gian cố định để chức năng chấm dứt.
- Nếu hàm chấm dứt trong khoảng thời gian, bạn sẽ lấy giá trị trả về hàm.
- Nếu hàm không chấm dứt trong khoảng thời gian, bạn muốn lấy giá trị mặc định [dự phòng].
- Với chức năng sau
5 chạy mãi mãi trong một vòng lặp trong khi vòng lặp:from timeout import timeout # Timeout a long running function with the default expiry of 10 seconds. @timeout def long_running_function1[]: ... # Timeout after 5 seconds @timeout[5] def long_running_function2[]: ... # Timeout after 30 seconds, with the error "Connection timed out" @timeout[30, os.strerror[errno.ETIMEDOUT]] def long_running_function3[]: ...
- Trong mã chính của bạn, bạn muốn chạy chức năng và chờ một số giây nhất định như được đưa ra bởi biến ____ ____ 16 nhưng không còn nữa.
Nếu hàm không trả về bất cứ điều gì trong ràng buộc thời gian nhất định, bạn muốn trả về một giá trị được chỉ định theo mặc định [
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1[]:
...
# Timeout after 5 seconds
@timeout[5]
def long_running_function2[]:
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout[30, os.strerror[errno.ETIMEDOUT]]
def long_running_function3[]:
...
7].Cài đặt và nhập func_timeout
Ví dụ giải pháp hướng dẫn
$ pip install func_timeout
Chức năng đi qua
Đối số chức năng
Giả sử bạn cần gọi một hàm dài có khả năng nhưng bạn chỉ có thể đợi thời gian cố định để chức năng chấm dứt.
Ví dụ giải pháp hướng dẫn
Chức năng đi qua: Let’s have a look at the following code snippet that showcases how to solve the specified problem—I’ll explain it subsequently after the code:
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1[]:
...
# Timeout after 5 seconds
@timeout[5]
def long_running_function2[]:
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout[30, os.strerror[errno.ETIMEDOUT]]
def long_running_function3[]:
...
0Đối số chức năng
Giả sử bạn cần gọi một hàm dài có khả năng nhưng bạn chỉ có thể đợi thời gian cố định để chức năng chấm dứt.
Nếu hàm chấm dứt trong khoảng thời gian, bạn sẽ lấy giá trị trả về hàm.
Nếu hàm không chấm dứt trong khoảng thời gian, bạn muốn lấy giá trị mặc định [dự phòng].
Chức năng đi qua
Đối số chức năng
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1[]:
...
# Timeout after 5 seconds
@timeout[5]
def long_running_function2[]:
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout[30, os.strerror[errno.ETIMEDOUT]]
def long_running_function3[]:
...
1Giả sử bạn cần gọi một hàm dài có khả năng nhưng bạn chỉ có thể đợi thời gian cố định để chức năng chấm dứt.
Đối số chức năng
Giả sử bạn cần gọi một hàm dài có khả năng nhưng bạn chỉ có thể đợi thời gian cố định để chức năng chấm dứt.
Nếu hàm chấm dứt trong khoảng thời gian, bạn sẽ lấy giá trị trả về hàm.
from timeout import timeout
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1[]:
...
# Timeout after 5 seconds
@timeout[5]
def long_running_function2[]:
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout[30, os.strerror[errno.ETIMEDOUT]]
def long_running_function3[]:
...
2Tất nhiên, bạn cũng có thể vượt qua nhiều đối số bằng cách chỉ định danh sách độ dài lớn hơn 1 là đối số cho
if __name__ == '__main__': # Start foo as a process p = multiprocessing.Process[target=foo, name="Foo", args=[10,]] p.start[] # Wait 10 seconds for foo time.sleep[10] # Terminate foo p.terminate[] # Cleanup p.join[]5 như vậy:
def long_function[n]: while True: pass2 sẽ gọi hàm
def long_function[n]: while True: pass3.
Trong khi làm việc như một nhà nghiên cứu trong các hệ thống phân tán, Tiến sĩ Christian Mayer đã tìm thấy tình yêu của mình đối với việc dạy các sinh viên khoa học máy tính.
Để giúp học sinh đạt được thành công cao hơn của Python, ông đã thành lập trang web giáo dục chương trình Finxter.com. Ông là tác giả của cuốn sách lập trình phổ biến Python Oneer [Nostarch 2020], đồng tác giả của loạt sách Break Break Python, những cuốn sách tự xuất bản, người đam mê khoa học máy tính, freelancer và chủ sở hữu của một trong 10 blog Python lớn nhất trên toàn thế giới.
Niềm đam mê của ông là viết, đọc và mã hóa. Nhưng niềm đam mê lớn nhất của anh là phục vụ các lập trình viên đầy tham vọng thông qua Finxter và giúp họ tăng cường các kỹ năng của họ. Bạn có thể tham gia học viện email miễn phí của anh ấy ở đây.