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') |
编辑
请下载此测试文件。我创建了一个线程类,并在发生超时错误时在线程内引发异常。但线程仍然是活动的,因为它打印
我已经编辑了我的文章,以使用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秒钟内收到"超时"消息,即使
处理这一问题的一种方法是将此任务放入线程中,并在90秒后使用看门狗将其杀死。
这是ActiveState的食谱。
编辑:显然,配方本身并不是完整的解决方案。如果工作线程完成了,那么您将拥有一个每x秒检查一次的看门狗线程,或者您将进入一个事件框架,如Michael Ford的简单事件框架。