首页 > 解决方案 > 无响应方法调用的时间限制

问题描述

我有一个有点错误的 Python 模块。有时,函数调用会持续很长时间,甚至会出现段错误。upstrean 要解决这个问题还需要很长时间。我需要找到一种方法来运行ball()有时间限制的方法。不幸的是,这里的建议无济于事,因为该过程没有响应。有什么提示吗?

from contextlib import contextmanager
import signal
import math
import time
from meshpy.geometry import (
    EXT_OPEN,
    GeometryBuilder,
    generate_surface_of_revolution,
)
from meshpy.tet import MeshInfo, build


# function that takes about 1min
def ball(h):
    r = 3.0
    polar_subdivision = int(math.pi / h)
    dphi = math.pi / polar_subdivision

    def truncate(val):
        return 0 if abs(val) < 1e-10 else val

    rz = [
        [truncate(r * math.sin(i * dphi)), r * math.cos(i * dphi)]
        for i in range(polar_subdivision + 1)
    ]

    geob = GeometryBuilder()
    radial_subdivision = int(2 * math.pi / h)
    geob.add_geometry(
        *generate_surface_of_revolution(
            rz, closure=EXT_OPEN, radial_subdiv=radial_subdivision
        )
    )

    mesh_info = MeshInfo()
    geob.set(mesh_info)

    build(mesh_info)
    # time.sleep(20)  # works


# from <https://stackoverflow.com/a/601168/353337>
class TimeoutException(Exception):
    pass


@contextmanager
def time_limiter(seconds):
    def signal_handler(signum, frame):
        raise TimeoutException("Timed out!")
    signal.signal(signal.SIGALRM, signal_handler)
    signal.alarm(seconds)
    try:
        yield
    finally:
        signal.alarm(0)


with time_limiter(3):
    ball(0.02)

标签: pythonmultithreading

解决方案


推荐阅读