关于python:如果被卡住了90秒,如何从功能返回?

How to return from function if got stuck for 90 seconds?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Timeout on a Python function call

我想实现的是,当函数完成时间超过90秒时,它应该在超时时立即返回。有没有办法做到这一点?

1
2
3
4
5
6
7
8
def abc(string):
    import re
    if re.match('some_pattern', string):
        return True
    else:
        return False

abc('some string to match')

编辑

请下载此测试文件。我创建了一个线程类,并在发生超时错误时在线程内引发异常。但线程仍然是活动的,因为它打印i am still alive :),即使在异常之后也是如此。为什么异常不强制线程停止??


我已经编辑了我的文章,以使用jcollado的简单思想。

multiprocessing.process.join方法有一个超时参数,可以这样使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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())

产量

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

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


处理这一问题的一种方法是将此任务放入线程中,并在90秒后使用看门狗将其杀死。

这是ActiveState的食谱。

编辑:显然,配方本身并不是完整的解决方案。如果工作线程完成了,那么您将拥有一个每x秒检查一次的看门狗线程,或者您将进入一个事件框架,如Michael Ford的简单事件框架。