键盘中断在多线程python中不起作用
我正在尝试使用多线程来检查网络连接。我的代码是:键盘中断在多线程python中不起作用,python,Python,我正在尝试使用多线程来检查网络连接。我的代码是: exitFlag = 0 lst_doxygen=[] lst_sphinx=[] class myThread (threading.Thread): def __init__(self, counter): threading.Thread.__init__(self) self.counter=counter def run(self): print "Starting thread"
exitFlag = 0
lst_doxygen=[]
lst_sphinx=[]
class myThread (threading.Thread):
def __init__(self, counter):
threading.Thread.__init__(self)
self.counter=counter
def run(self):
print "Starting thread"
link_urls(self.counter)
def link_urls(delay):
global lst_doxygen
global lst_sphinx
global exitFlag
while exitFlag==0:
try:
if network_connection() is True:
try:
links = lxml.html.parse(gr.prefs().get_string('grc', 'doxygen_base_uri', '').split(',')[1]+"annotated.html").xpath("//a/@href")
for url in links:
lst_doxygen.append(url)
links = lxml.html.parse(gr.prefs().get_string('grc', 'sphinx_base_uri', '').split(',')[1]+"genindex.html").xpath("//a/@href")
for url in links:
lst_sphinx.append(url)
exitFlag=1
except IOError, AttributeError:
pass
time.sleep(delay)
print "my"
except KeyboardInterrupt:
exitFlag=1
def network_connection():
network=False
try:
response = urllib2.urlopen("http://google.com", None, 2.5)
network=True
except urllib2.URLError, e:
pass
return network
我已经设置了一个标志,在while循环中停止线程。我还想通过按Ctrl-C退出线程。所以我使用了try-except,但线程仍在工作,不会退出。如果我尝试使用
if KeyboardInterrupt:
exitFlag=1
线程只是第一次执行while循环然后存在,而不是try-except。
附笔
我已经在另一个模块中创建了myThread类的实例。您只能在主线程上获得信号或键盘中断。有多种方法可以处理它,但也许您可以将exitFlag设置为全局,并将异常处理程序移动到主线程。以下是我通常捕获CTRL-C的方法
import time
import signal
import sys
stop = False
def run():
while not stop:
print 'I am alive'
time.sleep(3)
def signal_handler(signal, frame):
global stop
print 'You pressed Ctrl+C!'
stop = True
t1 = threading.Thread(target=run)
t1.start()
signal.signal(signal.SIGINT, signal_handler)
print 'Press Ctrl+C'
signal.pause()
输出:
python threads.py
Press Ctrl+C
I am alive
I am alive
^CYou pressed Ctrl+C!
最后,我得到了我问题的答案。我需要将我的线程标记为守护进程。因此,当我创建实例if myThread类时,我将再添加一行:
thread1.myThread(2)
thread1.setDaemon(True)
thread1.start()
您能否显示创建线程实例的代码?顺便说一下,“if KeyboardInterrupt”将始终返回True,这不是捕获异常的方式。为了捕获CTRL-C,最好使用signal,请参阅模块非常长,它运行软件应用程序。我只使用这两行代码创建实例:thread1=myThread(2)thread1.start()