Hướng dẫn python stop function if takes too long - Chức năng dừng python nếu mất quá nhiều thời gian

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
    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.

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

Hướng dẫn python stop function if takes too long - Chức năng dừng python nếu mất quá nhiều thời gian

Đố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():
    ...
1

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.

Đố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():
    ...
2

Tấ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:
        pass
2 sẽ gọi hàm
def long_function(n):
    while True:
        pass
3.

Hướng dẫn python stop function if takes too long - Chức năng dừng python nếu mất quá nhiều thời gian

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.

Làm cách nào để dừng mã Python sau một khoảng thời gian nhất định?

Sử dụng thời gian.time () để dừng vòng lặp một thời gian sau một khoảng thời gian nhất định. Gọi time_start = thời gian. Time () để sử dụng Time_Start như một biến theo dõi khi vòng lặp trong khi bắt đầu. time() to stop a while loop after a certain amount of time. Call time_start = time. time() to use time_start as a variable that keeps track of when the while loop starts.

Làm thế nào để bạn hết thời gian một chức năng trong Python?

Sử dụng đa xử lý để hết thời gian chờ một chức năng Python Sử dụng một quy trình để giữ thời gian/kiểm tra thời gian chờ và một quy trình khác để gọi chức năng Python này.Từ đa xử lý quá trình nhập processDef inc_forever (): print ('bắt đầu hàm inc_forever () ...') print (next (counter)) def return_zero (): Use one process to keep time/check timeout and another process to call this Python function. from multiprocessing import Processdef inc_forever(): print('Starting function inc_forever()...') print(next(counter))def return_zero():

Làm thế nào để bạn dừng chức năng Python khi một điều kiện nhất định được đáp ứng?

Để dừng thực thi mã trong Python, trước tiên bạn cần nhập đối tượng SYS.Sau đó, bạn có thể gọi phương thức EXIT () để dừng chương trình chạy.Đó là cách đáng tin cậy nhất, đa nền tảng để dừng thực thi mã.call the exit() method to stop the program from running. It is the most reliable, cross-platform way of stopping code execution.

Làm cách nào để giới hạn thời gian chạy trong Python?

Sau khi cài đặt, bạn có thể nhập mô -đun func_timeout và sử dụng hàm func_timeout () có cùng tên trong mã Python của bạn để giới hạn thời gian thực hiện của một hàm nhất định.import the func_timeout module and use the func_timeout() function with the same name in your Python code to limit the execution time of a given function.