【问题标题】:Limiting execution time of a function call in Python kills my Kernel在 Python 中限制函数调用的执行时间会杀死我的内核
【发布时间】:2016-07-13 23:13:21
【问题描述】:

我需要在不同的输入上多次应用一个函数。有时该功能需要数小时才能运行。我不希望它持续超过 10 秒。我在之前的帖子 (How to limit execution time of a function call in Python) 中找到了该方法。我可以使用它,但是一旦完成,我的内核就会死掉(出乎意料)。您会在下面找到一个示例。

有人遇到这个问题/知道为什么会这样吗?

Fyk:我使用蜘蛛(Python 2.7.11 64bits,Qt 4.8.7,PyQt4 (API v2) 4.11.4 on Darwin)

import signal
import time


def signal_handler(signum, frame):
    raise Exception("Timed out!")

for i in range(10):
    signal.signal(signal.SIGALRM, signal_handler)
    signal.alarm(10)   # Ten seconds
    try:
        time.sleep(0.2) #  The function I want to apply
        print("Ok it works")
    except Exception, msg:
        print "Timed out!"

【问题讨论】:

    标签: python signals spyder


    【解决方案1】:

    您正在使用 SIGALRM 处理程序创建 10 个信号,这意味着您现在有 10 个异常同时发生。您可能想尝试一下:

    signal.signal(signal.SIGALRM, signal_handler)
    signal.alarm(10)   # Ten seconds
    
    for i in range(10):
        try:
            time.sleep(0.2) #  The function I want to apply
            print("Ok it works")
        except Exception, msg:
            print "Timed out!"
            break
    

    或者您可能要考虑在信号完成后关闭警报:

    for i in range(10):
        signal.signal(signal.SIGALRM, signal_handler)
        signal.alarm(10)   # Ten seconds
        try:
            time.sleep(i * 2) #  Force it to break,
            print("Ok it works")
        except Exception, msg:
            print "Timed out!"
        signal.alarm(0)
    

    【讨论】:

    • 感谢您的回答。我没有意识到我需要关闭我的 signal.alarm !我想要循环内的警报。但如果我关闭它,它会起作用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2013-04-24
    • 1970-01-01
    相关资源
    最近更新 更多