2 потока, каждый из которых обслуживает 2 разных HTTP-сервера, не будут останавливаться через определенное время

Так что я потратил хотя бы пару дней на эту проблему.

Я хотел бы иметь 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 ответа

Хорошо, я понял, что проблема с сокетом. Мой сокет открыт, и хотя я попробовал socket.settimeout, я все еще не могу закрыть сокет

Спасибо Андрею.. моему сыну, у которого в голове возникла идея... вот решение...

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()
Другие вопросы по тегам