python(11): 多线程不响应ctrl+c

目标:多线程运行过程中ctrl+c即可中断整个程序运行。

demo1:  多线程为普通线程时==》ctrl+c无法退出程序

def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar(para):
    print("start thread:{}".format(para))
    time.sleep(20)
    print("end thread:{}".format(para))


if __name__ == '__main__':
    ths = []
    for i in range(10):
        t=Thread(target=bar,args=(i,))
        # t.daemon = True
        ths.append(t)

    for item in ths:
        item.start()

    print('main end')

》》

demo2: 设置为守护线程加join阻塞主程序 ==》 ctrl+c无法退出程序

def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar(para):
    print("start thread:{}".format(para))
    time.sleep(20)
    print("end thread:{}".format(para))

if __name__ == '__main__':

    ths = []
    for i in range(10):
        t=Thread(target=bar,args=(i,))
        t.daemon = True
        ths.append(t)

    for item in ths:
        item.start()

    for item in ths:
        print('join-')
        item.join()

    print('main end')

demo3:引入信号处理,查看信号接收情况

def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar(para):
    print("start thread:{}".format(para))
    time.sleep(20)
    print("end thread:{}".format(para))

def handler(signum, frame):
     global is_exit
     is_exit = True
     print("receive a signal {0}, is_exit = {1}".format(signum, is_exit))

if __name__ == '__main__':
    signal.signal(signal.SIGINT, handler)
    signal.signal(signal.SIGTERM, handler)
    ths = []
    for i in range(10):
        t=Thread(target=bar,args=(i,))
        # t.daemon = True
        ths.append(t)

    for item in ths:
        item.start()

    print('main end')

信号接收情况:

1.非daemon线程执行时,主线程代码执行完后,要等线程执行完才处理接收的信号  --信号不能被立即处理

2.join阻塞时信号会被接收,不会被处理,join完成后会处理信号   -- 信号不能被立即处理

综上:主线程代码未执行完毕且非阻塞的情况下才能立即处理信号

改进:

1.使用thread.isAlive()判断各个子线程是否执行完毕;在主线程中不使用join方法以免不能立即处理信号

2.使用全局变量标志是否应该退出主线程,需要在信号处理程序中根据接收的信号改变全局变量的值

3.配置所有线程为daemon:主线程退出则整个进程退出

demo4:开启多线程,ctrl+c即退出程序

def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar(para):
    print("start thread:{}".format(para))
    time.sleep(10)
    print("end thread:{}".format(para))

def handler(signum, frame):
     global is_exit
     is_exit = True
     print("receive a signal {0}, is_exit = {1}".format(signum, is_exit))

if __name__ == '__main__':
    signal.signal(signal.SIGINT, handler)
    signal.signal(signal.SIGTERM, handler)
    ths = []
    global is_exit
    is_exit = False
    for i in range(10):
        t=Thread(target=bar,args=(i,))
        t.daemon = True
        ths.append(t)

    for item in ths:
        item.start()

    while 1:
        print('======', is_exit)
        alive = False
        for item in ths:
            alive = alive or item.isAlive()
        if not alive or is_exit:
            break
        time.sleep(1)
    print('main end')

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接口自动化测试框架是基于Python语言开发的,主要使用了以下几个工具和库:requests、yami、pytest、allure和logging。 首先,requests是Python中一个常用的HTTP库,在接口测试中用于发送HTTP请求,并获取响应结果。它提供了简洁的API,使得发送各种类型的请求变得非常方便。 其次,yami是一个用于解析接口返回数据的库。它可以帮助我们从HTTP响应中提取所需的数据,并进行断言判断,比如验证返回的状态码、响应内容等。 然后,pytest是一个Python的测试框架,它具有很强大的测试用例管理和执行能力。我们可以使用pytest来编写接口测试用例,并结合fixture功能对测试环境进行初始化和清理工作。 allure是一个用于生成测试报告的工具。它可以将测试结果以可视化的方式展示,同时具备丰富的报告元素,比如用例执行状态、失败原因等。这样可以方便查看测试结果,快速定位问题。 最后,logging是Python内置的日志记录工具,在接口自动化测试中,我们可以使用logging来记录一些重要的操作或错误信息,帮助我们进行调试和问题追踪。 综上所述,以上工具和库是常用于搭建接口自动化测试框架的重要组成部分。通过它们的结合使用,可以辅助我们完成接口测试的各项工作,包括发送请求、解析响应、断言判断、测试用例管理、生成测试报告等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值