【Python笔记】Python多线程进程如何正确响应Ctrl-C以实现优雅退出

本文介绍了Python多线程进程中如何响应Ctrl-C实现优雅退出。常见的错误包括尝试捕获KeyboardInterrupt异常和直接注册信号处理函数。解决方法包括使用thread.join()的timeout参数和遵循Python信号处理规则,确保信号处理在主线程中进行。
摘要由CSDN通过智能技术生成

相信用C/C++写过服务的同学对通过响应Ctrl-C(信号量SIG_TERM)实现多线程C进程的优雅退出都不会陌生,典型的实现伪码如下:

#include <signal.h>

int main(int argc, char * argv[]) 
{
    // 1. do some init work 
    ... init() ...

    // 2. install signal handler, take SIGINT as  example install:
    struct sigaction action;
    memset(&action, 0, sizeof(struct sigaction));
    action.sa_handler = term;
    sigaction(SIGTERM, &action, NULL);

    // 3. create thread(s)
    pthread_create(xxx);

    // 4. wait thread(s) to quit
    pthread_join(thrd_id);

    return 0;
}

主要步骤概括如下:
1)设置SIG_TERM信号量的处理函数
2)创建子线程
3)主线程通过pthread_join阻塞
4)主线程收到Ctrl-C对应的SIG_INT信号后,信号处理函数被调用,该函数通常会设置子线程的退出flag变量
5)子线程的spin-loop通常会检测flag变量,当flag指示退出时机已到时,子线程break其loop
6)待子线程释放资源退出后,主线程的pthread_join()结束阻塞返回,主线程退出,进程销毁

然而,如果用Python多线程库(threading或thread)实现一个与上述伪码流程相似的多线程模块时,新手很容易犯错,导致进程启动后,C

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值