python 设置方法超时

本文介绍了一个Python脚本,该脚本能够运行外部命令并设置超时限制。通过使用子进程和信号处理,该脚本能够在指定时间内终止未完成的任务。
#!/usr/bin/python
#-*-coding:utf-8-*-
import os,time,signal,platform,subprocess

class TimeoutError(Exception):
    pass

def run_command(cmd, timeout=60):
    is_linux = platform.system() == 'Linux'
    
    p = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid if is_linux else None)
    t_beginning = time.time()
    seconds_passed = 0
    while True:
        if p.poll() is not None:
            break
        seconds_passed = time.time() - t_beginning
        if timeout and seconds_passed > timeout:
            if is_linux:
                os.killpg(p.pid, signal.SIGTERM)
            else:
                p.terminate()
            raise TimeoutError(cmd, timeout)
        time.sleep(0.1)
    return p.stdout.read()

if __name__ == '__main__':
    cmd = 'ping www.google.com
    timeout = 10
    try:
        result = run_command(cmd, timeout)
    except TimeoutError:
        print 'excute command=<%s> timeout after %i' %(cmd,timeout)
    else:
        print = 'other error'

解决Python自定义方法超时问题,目前可通过`signal.alarm()`和`threading`两种方式实现超时异常功能,以下重点介绍`threading`实现超时异常的方法: - **原理**:将要调用的功能函数放入子线程,通过设定子线程的阻塞时间超时则主线程并不会等待子线程的执行。主线程退出,子线程就不存在了。核心是在程序中添加`join()`方法,用于等待线程结束。`join()`的作用是,在子线程完成运行之前,这个子线程的父线程将会被一直阻塞 [^2]。 - **示例代码**: ```python import threading import sys import time class Dispacher(threading.Thread): def __init__(self, fun, args): threading.Thread.__init__(self) self.setDaemon(True) self.result = None self.error = None self.fun = fun self.args = args self.start() def run(self): try: self.result = self.fun(self.args) except: self.error = sys.exc_info() def test_fun(i): # time.sleep(4) a = i*i return a def main_fun(): c = Dispacher(test_fun, 2) c.join(2) if c.isAlive(): return "TimeOutError" elif c.error: return c.error[1] t = c.result return t if __name__ == '__main__': fun = main_fun() print(fun) ``` 在上述代码中,`Dispacher`类继承自`threading.Thread`,用于创建一个子线程执行传入的函数。`main_fun`函数创建了一个`Dispacher`实例,并调用`join(2)`方法等待2秒。如果2秒后子线程仍在运行,则返回`TimeOutError`;如果子线程出现异常,则返回异常信息;否则返回函数的执行结果 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值