2个线程,每个服务2个不同的HTTP Server,在给定的持续时间后不会停止

时间:2015-10-29 23:16:19

标签: multithreading httpserver

所以我至少花了几天时间来解决这个问题。

我想有2个线程的HTTP服务器,每个服务器提供两个不同的IP:端口 我打开一个FF并导航到说:http://196.64.131.250:8001/http://196.64.131.250:8002,它应该执行GET。

此外,我喜欢我的线程或程序本身在命令行给定持续时间后停止5秒。 我已尽我所能,甚至尝试了SIGAlarm和变量" keepRunning"在持续时间后由第三个线程更改,但我的程序不会停止。请问我做错了什么。

请注意我已对守护进程发表了评论:即(ZhttpThread [1-2] .daemon = True)

如果我不评论它我的线程马上停止。我希望我的HTTP服务器线程继续服务,如果持续时间DUR到期,则程序停止或线程停止。

import SimpleHTTPServer, SocketServer, logging, cgi, sys, signal, threading, time
import subprocess as sub

keepRunning = True
origTime = int(time.time())

class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        logging.warning("======= GET STARTED =======")
        getHdr = self.headers
        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
        getHdr = self.headers
        print(', '.join((getHdr)))
        #if ("accept-encoding" in getHdr):
        if ("accept-encoding" in (', '.join((getHdr)))):
            print ('Test Passed ---------------')
            signal.alarm(1)

class threadWithTO(threading.Thread):
    def __init__(self, thID, ip, port, timeout):
        threading.Thread.__init__(self)
        self.ip = ip
        self.port = port
        self.handler = ServerHandler
        self.httpd = SocketServer.TCPServer((self.ip, self.port), self.handler)
    def run(self):
        print (self.httpd)
        #self.httpd.serve_forever()
        if (keepRunning == True):
           self.httpd.handle_request()
        else:
           self._stop.set()
    def Run(self):
        self.start()

def timeHandler(signum, frame):
    print('Times up', signum)
    sys.exit()

def timeChkr( threadName, dur, t1, t2):
  print (origTime)
  print ('Begin Timer thread')
  while True:
    nowTime = int(time.time())
    print (nowTime)
    delta = nowTime - origTime
    if (delta >= dur):
        keepRunning = False
        t1.stop()
        t2.stop()
    else:
        time.sleep(1)

def main():
    #signal.signal(signal.SIGALRM, timeHandler)
    #signal.alarm(DUR)

    origTime = int(time.time())
    ZhttpThread1 = threadWithTO("thread1", I, PORT, DUR)
    ZhttpThread2 = threadWithTO("thread2", I, (int(PORT)+1), DUR)

    t = threading.Thread(target=timeChkr, args = ("thread3",DUR))
    t.daemon = True
    t.start()

    #ZhttpThread1.daemon = True
    #ZhttpThread2.daemon = True

    ZhttpThread1.Run()
    ZhttpThread2.Run()

2 个答案:

答案 0 :(得分:0)

好吧我发现问题在于套接字。我的套接字是打开的,即使我已经尝试过socket.settimeout,我仍然无法让套接字关闭

答案 1 :(得分:0)

感谢安德鲁......我的儿子在我的脑海中引发了这个想法......这是解决方案..

class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):

    def do_GET(self):
        logging.warning("======= GET STARTED =======")
        logging.warning(self.headers)
        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

    def do_POST(self):
        logging.warning("======= POST STARTED =======")
        logging.warning(self.headers)
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD':'POST',
                     'CONTENT_TYPE':self.headers['Content-Type'],
                     })
        logging.warning("======= POST VALUES =======")
        print form.list
        '''
        for item in form.list:
            logging.warning(item) '''
        logging.warning("\n")
        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

class StoppableHTTPServer(BaseHTTPServer.HTTPServer):
    def server_bind(self):
        BaseHTTPServer.HTTPServer.server_bind(self)
        self.socket.settimeout(1)
        self.run = True

    def get_request(self):
        while self.run:
            try:
                sock, addr = self.socket.accept()
                sock.settimeout(None)
                return (sock, addr)
            except socket.timeout:
                pass

    def stop(self):
        self.run = False

    def serve(self):
        while self.run:
            #print "1"
            self.handle_request()

if __name__=="__main__":
    if len(sys.argv) < 1:
        I = ""
        PORT = 8000
        DUR = 10
    else:
        I = sys.argv[1]
        PORT = int(sys.argv[2])
        DUR = int(sys.argv[3])

    #httpd1 = StoppableHTTPServer((I,PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
    #httpd2 = StoppableHTTPServer((I,(int(PORT)+1)), SimpleHTTPServer.SimpleHTTPRequestHandler)
    httpd1 = StoppableHTTPServer((I,PORT), ServerHandler)
    httpd2 = StoppableHTTPServer((I,(int(PORT)+1)), ServerHandler)
    thread.start_new_thread(httpd1.serve, ())
    thread.start_new_thread(httpd2.serve, ())
    #raw_input("Press <RETURN> to stop server\n")`enter code here`
    print '0'
    time.sleep(DUR)
    print 'Times up Dude'
    httpd1.stop()
    httpd2.stop()