为了账号安全,请及时绑定邮箱和手机立即绑定

python 多线程下如何正确响应 ctrl + c

python 多线程下如何正确响应 ctrl + c

慕码人2483693 2019-05-11 16:33:33
我在测试多线程时,发现有写模块无法在多线程下正确响应ctrl+c,经过我测试,应该为paste模块所致,请问这种情况如何处理较好?importsysimportthreadingimporttimeimportbottleHttpThread1=NoneHttpThread2=None@bottle.route('/hello')defhello():return"HelloWorld!"defserver1():bottle.run(server='paste',port=8081)defserver2():bottle.run(server='paste',port=8082)definfo():print(threading.active_count())try:HttpThread1=threading.Thread(target=server1,args=())HttpThread1.setDaemon(True)HttpThread1.start()HttpThread2=threading.Thread(target=server2,args=())HttpThread2.setDaemon(True)HttpThread2.start()whileTrue:info()time.sleep(1)exceptKeyboardInterrupt:sys.exit(1)我现有的解决方案为采用multiprocessing库来解决程序退出问题。
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

threading.Condition
python3
importthreading
importtime
class子线程(threading.Thread):
def__init__(self):
super().__init__()
self.cond=threading.Condition()#条件锁
self.isStoped=False#结束标志
defrun(self):
print('线程开始')
n=0
while1:
withself.cond:#锁
n+=1
print(n)#要完成的事
self.cond.wait(1)#休眠1秒
ifself.isStoped:break#退出线程循环
print('线程结束')
def结束线程(self):
withself.cond:#锁
self.isStoped=True#设置结束标志
self.cond.notify()#唤醒休眠的线程,立即结束。
#主线程
if__name__=='__main__':
t=子线程()
t.start()
try:
while1:
time.sleep(0.1)#等待ctrl-c,让线程干事
exceptKeyboardInterrupt:
t.结束线程()
finally:
t.结束线程()
t.join()
input('按键退出')
                            
查看完整回答
反对 回复 2019-05-11
?
HUX布斯

TA贡献1876条经验 获得超6个赞

@同意并接受@Yujiaao这样做不行的,对于可以休眠的子线程程序,这样做当然没有问题。
但是,bottle和paste是做webserver的,也就是说run中运行的是不会结束的,而bottle又没有开放paste的API(至少调用没有开放)。
ctrl+c需要先把事件透传到子线程上去,先结束子线程,然后结束主线程。
还没测试信号处理,我现在测试关闭信号处理,看看能不能解决。
                            
查看完整回答
反对 回复 2019-05-11
  • 2 回答
  • 0 关注
  • 1565 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信