专栏首页YG小书屋python 超时任务kill

python 超时任务kill

编程过程中遇到代码执行超时问题。场景是在主进程中启动多个子进程并行执行,假设平时一个进程10分钟能执行完毕,但在一些极端情况下执行一个小时也没结束,此时需要杀掉子进程,返回任务执行失败。 用python的进程池执行操作时没法设置超时时间,只能从进程内部想办法。

思路一:

用timer定时,当执行时间超时时让进程终止:

def cancel_cur_computer():
    #通过抛出异常,来终止当前执行节点
    logging.warning("%s timeout killed" % str(os.getpid()))
    os.kill(os.getpid(), signal.SIGKILL)
    logging.warning("%s timeout killed" % str(os.getpid()))

def run():
    timer = threading.Timer(3, cancel_cur_computer) 
    print("bbb")
    timer.start()
    time.sleep(20)

def test_timer():
    pool = Pool(3)
    try:
        for i in range(0, 3):
            #run()
            pool.apply_async(run)
    except Exception as e:
        logging.exception(e)

    pool.close()
    pool.join()

test_timer()

当不用进程池时,即打开run(),注释pool.apply_async(run),执行没有问题,定时器可以杀死进程。 当使用进程池,即注释run(),打开pool.apply_async(run),可以打印出logging.warning("%s timeout killed" % str(os.getpid())),但进程没有被杀死,反而一直卡死在os.kill(os.getpid(), signal.SIGKILL)处,我猜可能与进程池有关系。杀掉进程池中的进程也不合理。

思路二

用single的闹钟来解决这个问题

def handler(signum, frame):
    raise Exception("timeout...")

def run():
    try:  
        signal.signal(signal.SIGALRM, handler)  
        signal.alarm(3)   # 设置超时时间为3s
        time.sleep(40) # 模拟长时间执行任务
    except Exception as e:  
        logging.exception(e)
    finally:  
        signal.alarm(0)  # 取消闹钟
    print("aaaaa")

def test_timer():
    pool = Pool(3)
    try:
        for i in range(0, 3):
            pool.apply_async(run)
    except Exception as e:
        logging.exception(e)

    pool.close()
    pool.join()

test_timer()

解决问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MR处理流程

    参考文章: 1、http://zheming.wang/blog/2015/05/19/3AFF5BE8-593C-4F76-A72A-6A40FB140D4...

    YG
  • 一种通用调度平台的设计思路

    工作流:有的同学认为执行一个脚本就是执行一个任务,而有的同学则是将多个脚本组装的流称为任务。本文采用后者的思路,为了避免歧义,则会将任务流称为工作流。

    YG
  • python 进程池异步调用与进程间通信

    YG
  • 性能测试必备知识(3)- 深入理解“平均负载”

    每次发现系统变慢时,通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况

    小菠萝测试笔记
  • 百度开源BFE被CNCF接纳为Sandbox Project

    2020年6月24日,BFE[1]开源项目被CNCF[2] (Cloud Native Computing Foundation,云原生计算基金会)正式接纳为S...

    公众号: 云原生生态圈
  • 学习|Unity3d的导航实现循环线路移动

    前阵子用Unity3d做的那个模拟收费的动画,主要是模拟了一个项目中的场景,让人看到更直观一些,最主要的目的还是最近在学习Unity3d,直接以实际项目应用的方...

    Vaccae
  • Python——域名解析成IP地址

    一.说明 Python的Socket模块提供有域名转为对应IP地址的方法。本例中,将urllist.txt中的每行URL都试图解析成IP地址,保存到ip...

    py3study
  • 【JS】416- Promise知识点自测

    Promise 想必大家都十分熟悉,想想就那么几个 api,可是你真的了解 Promise 吗?本文根据 Promise 的一些知识点总结了十道题,看看你能做对...

    pingan8787
  • 剑指offer:重建一个二叉树

    解答这个题之前,需要我们了解有关数据结构中二叉树树的相关知识,二叉树的结构如下图所示

    陌无崖
  • Promise 必知必会(十道题)

    Promise 想必大家都十分熟悉,想想就那么几个 api,可是你真的了解 Promise 吗?本文根据 Promise 的一些知识点总结了十道题,看看你能做对...

    Nealyang

扫码关注云+社区

领取腾讯云代金券