猿问

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

我在测试多线程时,发现有写模块无法在多线程下正确响应ctrl+c,经过我测试,应该为paste模块所致,请问这种情况如何处理较好?
importsys
importthreading
importtime
importbottle
HttpThread1=None
HttpThread2=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库来解决程序退出问题。
慕码人2483693
浏览 1566回答 2
2回答

慕娘9325324

threading.Conditionpython3importthreadingimporttimeclass子线程(threading.Thread):def__init__(self):super().__init__()self.cond=threading.Condition()#条件锁self.isStoped=False#结束标志defrun(self):print('线程开始')n=0while1:withself.cond:#锁n+=1print(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('按键退出')

HUX布斯

@同意并接受@Yujiaao这样做不行的,对于可以休眠的子线程程序,这样做当然没有问题。但是,bottle和paste是做webserver的,也就是说run中运行的是不会结束的,而bottle又没有开放paste的API(至少调用没有开放)。ctrl+c需要先把事件透传到子线程上去,先结束子线程,然后结束主线程。还没测试信号处理,我现在测试关闭信号处理,看看能不能解决。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答