0

我正在尝试做多线程来检查网络连接。我的代码是:

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

而不是try-except,线程只适用于第一次执行while循环然后存在。ps 我在另一个模块中创建了 myThread 类的实例。

4

3 回答 3

1

最后,我得到了我的问题的答案。我需要将我的线程标记为守护进程。因此,当我创建 myThread 类的实例时,我将再添加一行:

thread1.myThread(2)
thread1.setDaemon(True)
thread1.start()
于 2013-07-31T22:28:21.270 回答
0

您只能在主线程上获得信号或 KeyboardInterrupt。有多种方法可以处理它,但也许您可以将 exitFlag 设为全局并将异常处理程序移动到您的主线程。

于 2013-07-27T02:12:42.200 回答
0

以下是我一般捕获 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!
于 2013-07-27T02:32:36.620 回答