Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 2个线程,每个线程服务于2个不同的HTTP服务器,在给定的持续时间后不会停止_Multithreading_Httpserver - Fatal编程技术网

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

Multithreading 2个线程,每个线程服务于2个不同的HTTP服务器,在给定的持续时间后不会停止,multithreading,httpserver,Multithreading,Httpserver,所以我在这个问题上至少花了几天时间 我希望有两个线程HTTP服务器,每个线程服务于两个不同的IP:端口。 我打开FF并导航到说:或,它应该执行GET 此外,我喜欢我的线程或程序本身在命令行给定的持续时间(比如5秒)后停止。 我已经尽了我所能,甚至尝试了sigallarm和变量“keepRunning”,它在持续时间后被第三个线程更改,但我的程序并没有停止。请问我做错了什么 注意,我已经对守护进程进行了注释:即(ZhttpThread[1-2]。daemon=True) 如果我不评论它,我的线程就

所以我在这个问题上至少花了几天时间

我希望有两个线程HTTP服务器,每个线程服务于两个不同的IP:端口。
我打开FF并导航到说:或,它应该执行GET

此外,我喜欢我的线程或程序本身在命令行给定的持续时间(比如5秒)后停止。 我已经尽了我所能,甚至尝试了sigallarm和变量“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()

好的,我发现问题出在插座上。我的套接字已打开,即使我尝试了socket.settimeout,我仍然无法关闭套接字

好的,我发现问题出在套接字上。我的套接字已打开,尽管我已尝试了socket.settimeout,但由于Andrew,我仍然无法关闭套接字。。我的儿子在我脑海中激发了这个想法。。。这是解决办法

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()
类ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_获得(自我):
logging.warning(“=============入门========”)
logging.warning(self.headers)
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
def do_POST(自我):
logging.warning(“==========启动后========”)
logging.warning(self.headers)
form=cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
环境={'REQUEST_METHOD':'POST',
“内容类型”:self.headers[“内容类型”],
})
logging.warning(“==========POST值=====”)
打印表单列表
'''
对于form.list中的项目:
日志记录。警告(项目)“”
日志记录。警告(“\n”)
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
类StoppableHTTPServer(BaseHTTPServer.HTTPServer):
def服务器绑定(自):
BaseHTTPServer.HTTPServer.server\u绑定(自)
self.socket.settimeout(1)
self.run=True
def get_请求(自我):
自运行时:
尝试:
sock,addr=self.socket.accept()
sock.settimeout(无)
返回(sock,addr)
除socket.timeout外:
通过
def停止(自):
self.run=False
def serve(自我):
自运行时:
#打印“1”
self.handle_请求()
如果名称=“\uuuuu main\uuuuuuuu”:
如果len(sys.argv)<1:
I=“”
端口=8000
DUR=10
其他:
I=sys.argv[1]
PORT=int(sys.argv[2])
DUR=int(sys.argv[3])
#httpd1=StoppableHTTPServer((I,端口),SimpleHTTPServer.simplehttpprequesthandler)
#httpd2=StoppableHTTPServer((I,(int(端口)+1)),SimpleHTTPServer.simplehttpprequesthandler)
httpd1=StoppableHTTPServer((I,端口),ServerHandler)
httpd2=StoppableHTTPServer((I,(int(端口)+1)),ServerHandler)
线程。启动新线程(httpd1.serve,())
线程。启动新线程(httpd2.serve,())
#原始输入(“按下以停止服务器”)`在此处输入代码`
打印“0”
睡眠时间(DUR)
打印“Times up Dude”
httpd1.stop()
httpd2.stop()

感谢安德鲁。。我的儿子在我脑海中激发了这个想法。。。这是解决办法

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()
类ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_获得(自我):
logging.warning(“=============入门========”)
logging.warning(self.headers)
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
def do_POST(自我):
logging.warning(“==========启动后========”)
logging.warning(self.headers)
form=cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
环境={'REQUEST_METHOD':'POST',
“内容类型”:self.headers[“内容类型”],
})
logging.warning(“==========POST值=====”)
打印表单列表
'''
对于form.list中的项目:
日志记录。警告(项目)“”
日志记录。警告(“\n”)
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
类StoppableHTTPServer(BaseHTTPServer.HTTPServer):
def服务器绑定(自):
BaseHTTPServer.HTTPServer.server\u绑定(自)
self.socket.settimeout(1)
self.run=True
def get_请求(自我):
自运行时:
尝试:
sock,addr=self.socket.accept()
sock.settimeout(无)
返回(sock,addr)
除socket.timeout外:
通过
def停止(自):
self.run=False
def serve(自我):
自运行时:
#打印“1”
self.handle_请求()
如果名称=“\uuuuu main\uuuuuuuu”:
如果len(sys.argv)<1:
I=“”
端口=8000
DUR=10
其他:
I=sys.argv[1]
PORT=int(sys.argv[2])
DUR=int(sys.argv[3])
#httpd1=StoppableHTTPServer((I,端口),SimpleHTTPServer.simplehttpprequesthandler)
#httpd2=StoppableHTTPServer((I,(int(端口)+1)),SimpleHTTPServer.simplehttpprequesthandler)
httpd1=StoppableHTTPServer((I,端口),ServerHandler)
httpd2=StoppableHTTPServer((I,(int(端口)+1)),ServerHandler)
线程。启动新线程(httpd1.serve,())
线程。启动新线程(httpd2.serve,())
#原始输入(“按下以停止服务器”)`在此处输入代码`
打印“0”
睡眠时间(DUR)
打印“Times up Dude”
httpd1.stop()
httpd2.stop()