【问题标题】:In Python, how can I enforce a timeout for a function call that sometimes hangs?在 Python 中,如何强制有时挂起的函数调用超时?
【发布时间】:2012-01-28 19:19:53
【问题描述】:

我正在使用 Python 蜘蛛通过 urllib2 OpenerDirector 抓取互联网。问题是连接将不可避免地挂在 https 地址上,显然忽略了超时值。

一种解决方案是在线程中运行它,然后如果线程挂起,则终止并重新启动线程。显然 Python 不支持杀死线程,由于垃圾收集和其他问题,它被认为是一个坏主意。但是,由于简单,这种解决方案对我来说更可取。

另一个想法是使用像 Twisted 这样的异步库,但这并不能解决问题。

我需要一种方法来强制中断呼叫或修复 urllib2 OpenerDirector 处理超时的方式。谢谢。

【问题讨论】:

    标签: python timeout urllib2 python-2.6 freeze


    【解决方案1】:

    另一个 StackOverflow 问题与 here 类似。当我遇到类似的事情时,我发现将我正在做的事情转换为定义和调用函数更容易,这些函数随后可以在超时事件时返回一个值。这实际上可以通过利用各种返回值来打开更多可能性。

    我在上面链接到的相关问题的另一个答案听起来更像您正在寻找的东西(据我了解):https://stackoverflow.com/a/5817436/1118357

    【讨论】:

    • 关于第 2 部分,显然“这并没有真正停止线程”。
    • 请您澄清一下“将我所做的转换为定义和调用函数”?
    【解决方案2】:

    我建议使用另一个进程而不是线程。像这样:

    from multiprocessing import Process
    
    checker = Process(target=yourFunction, args=(some_queue))
    timeout = 150
    checker.start()
    counter = 0
    while checker.is_alive() == True:
            time.sleep(1)
            counter += 1
            if counter > timeout :
                    print "Son process consumed too much run-time. Going to kill it!"
                    kill(checker.pid)
                    break
    

    这样子进程会在 150 秒后被杀死。

    【讨论】:

    • 另外,检查这个问题:link
    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2020-04-21
    • 2011-06-18
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多