如果卡住了 90 秒如何从函数返回? [复制]

2024-01-06

可能的重复:
Python 函数调用超时 https://stackoverflow.com/questions/492519/timeout-on-a-python-function-call

我想实现的是,当函数需要超过 90 秒才能完成时,它应该在超时时立即返回。有什么办法可以实现这一点吗?

def abc(string):
    import re
    if re.match('some_pattern', string):
        return True
    else:
        return False

abc('some string to match')

Edited

请下载this http://dl.dropbox.com/u/37127032/t.py测试文件。我创建了一个线程类,如果发生超时错误,则会在线程内引发异常。但线程仍然存在,因为它打印i am still alive :)即使在异常之后。为什么异常不会强制线程停止?


我已经编辑了我的帖子以供使用杰科拉多的想法 https://stackoverflow.com/a/8601961/190597这更简单。

The 多处理.Process.join http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.join方法有一个超时参数,您可以像这样使用:

import multiprocessing as mp
import time
import logging  
import re

logger = logging.getLogger(__name__)

def abc(string, result, wait = 0):
    time.sleep(wait)
    result.put(bool(re.match('some_pattern', string)))

if __name__ == '__main__':
    logging.basicConfig(level = logging.DEBUG,
                        format = '%(asctime)s:  %(message)s',
                        datefmt = '%H:%M:%S', )
    result = mp.Queue()
    proc = mp.Process(target = abc, args = ('some_pattern to match', result))
    proc.start()
    proc.join(timeout = 5)
    if proc.is_alive():
        proc.terminate()
    else:
        logger.info(result.get())

    proc = mp.Process(target = abc, args = ('some string to match', result, 20))
    proc.start()
    proc.join(timeout = 5)
    if proc.is_alive():
        logger.info('Timed out')
        proc.terminate()
    else:
        logger.info(result.get())

yields

12:07:59:  True
12:08:04:  Timed out

请注意,您会在 5 秒内收到“超时”消息,即使abc('some string',20)大约需要 20 秒才能完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果卡住了 90 秒如何从函数返回? [复制] 的相关文章

随机推荐