我正在編寫一個編程項目 - 在Python中編寫基本的P2P文件共享應用程序。我使用兩個線程:一個主線程調用select並等待來自套接字和sys.stdin列表的輸入(以接收輸入的命令)以及一個幫助線程,該狀態更新消息從隊列中取出並打印出來。 (它是唯一能夠打印任何內容的文件)Python中的信號處理程序的樂趣中斷選擇
我還需要捕獲標準的SIGINT並處理它以優雅地退出。我有一個戒菸的方法,這樣做,鍵入'quit'作爲一個命令工作得很好。所以在主線程中,我嘗試將此方法設置爲SIGINT的處理程序。據我所知,該進程捕獲信號並調用quit方法。輔助線程打印一條消息,確認它正在退出。但後來我從主線程得到以下錯誤信息:
Traceback (most recent call last):
File "peer.py", line 226, in <module>
main()
File "peer.py", line 223, in main
p.run()
File "peer.py", line 160, in run
readables, writables, exceptions = select(self.sockets, [], [])
select.error: (4, 'Interrupted system call')
之後程序仍然退出。鑑於沒有信號處理程序,發送SIGINT給我以下內容:
Traceback (most recent call last):
File "peer.py", line 225, in <module>
main()
File "peer.py", line 222, in main
p.run()
File "peer.py", line 159, in run
readables, writables, exceptions = select(self.sockets, [], [])
KeyboardInterrupt
無法終止程序;我必須制止並殺死它。這很令人困惑,因爲SIGINT似乎中斷了調用,只有當它被我的自定義方法捕獲時纔會選擇。 (其中只將消息放在打印隊列中並設置「完成」變量)有誰知道這會發生什麼?試圖同時使用信號處理程序和線程只是一個壞主意嗎?
你能發表一小段代碼來重現這種行爲嗎? –
是的,昨天晚上我停止工作後,我意識到我確實希望它中斷。據推測,它正在被執行信號處理程序中斷。所以我只是捕獲select.error並將其跳轉到循環的結尾,在那裏它立即退出並轉到清理代碼。 – dpitch40
@ dpitch40,如果你已經回答了你的問題,你應該將該評論轉換爲答案並接受它。 –