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