我在测试多线程时,发现有写模块无法在多线程下正确响应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.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布斯
TA贡献1876条经验 获得超6个赞
@同意并接受@Yujiaao这样做不行的,对于可以休眠的子线程程序,这样做当然没有问题。但是,bottle和paste是做webserver的,也就是说run中运行的是不会结束的,而bottle又没有开放paste的API(至少调用没有开放)。ctrl+c需要先把事件透传到子线程上去,先结束子线程,然后结束主线程。还没测试信号处理,我现在测试关闭信号处理,看看能不能解决。
添加回答
举报
0/150
提交
取消