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 条评论
登录 后参与评论

相关文章

来自专栏Java技术分享

集群分片

 由于复制中,每个数据库都是拥有完整的数据,因此复制的总数据存储量受限于内存最小的数据库节点,如果数据量过大,复制就无能为力了。

2349
来自专栏北京马哥教育

【实战】如何利用 Kali Linux 黑掉 Windows

引言 Kali Linux是一个派生自 Debian Linux且主要用于渗透测试的系统,目前已经拥有超过300个的预装测试工具。 Metasploit 是...

4014
来自专栏JadePeng的技术博客

Spring Boot配置文件放在jar外部

Spring Boot程序默认从application.properties或者application.yaml读取配置,如何将配置信息外置,方便配置呢? 查询...

7066
来自专栏Albert陈凯

Hadoop数据分析平台实战——160Sqoop介绍离线数据分析平台实战——160Sqoop介绍

离线数据分析平台实战——160Sqoop介绍 Sqoop介绍 Apache Sqoop(SQL-to-Hadoop) 是一款开源的工具,主要用于在Hadoop(...

3175
来自专栏不想当开发的产品不是好测试

jenkins 后台程序运行

# 背景 jenkins持续集成,需要任务后台执行(nohup执行)结果发现jenkins的job执行完后,看不到运行的进程 # 步骤 原因就是这么一个情况:J...

3495
来自专栏吴伟祥

logging总结 - log4j2使用流程[归档存储]

<web-app> 2.5 以前要多个依赖 log4j-web,还需要在web.xml配置listener、filter

2722
来自专栏散尽浮华

文件实时同步后防篡改的操作记录

需求场景: 部署一套sftp环境,用于客户上传电子文件(合同文件或视频文件等),文件上传到sftp后立即实时同步到业务应用服务器上。为了安全考虑,文件在首次同步...

3307
来自专栏Linux运维学习之路

企业级memcached缓存数据库结合php使用与web管理memcached

环境 [root@cache01 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Cor...

2676
来自专栏Fortress的专栏

ELK 集群,腾讯云上的日志监控不用愁

公司项目,越来越多的系统在计划上云。如何监控云上的系统运行,是每个系统上云的过程中都会碰到的一个问题。在这里,我们以公司的某个项目为例,向大家详细阐述该项目上云...

1.4K2
来自专栏桥路_大数据

使用flume搭建日志收集系统

3058

扫码关注云+社区

领取腾讯云代金券