我使用以下内容启动多个服务器:
from threading import Thread
from SocketServer import ThreadingMixIn
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write("Hello World!")
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
pass
def serve_on_port(port):
server = ThreadingHTTPServer(("localhost",port), Handler)
server.serve_forever()
Thread(target=serve_on_port, args=[1111]).start()
Thread(target=serve_on_port, args=[2222]).start()
我想在KeyboardInterrupt
停止这些帖子。
我怎么能这样做?
答案 0 :(得分:1)
要停止其中一台服务器,您可以使用其shutdown()
方法。这意味着您需要从捕获KeyboardInterrupt
的代码中引用服务器。例如:
servers = []
for port in [11111, 22222]:
servers.append(ThreadingHTTPServer(("localhost",port), Handler))
for server in servers:
Thread(target=server.serve_forever).start()
try:
while True:
time.sleep(1000000)
except KeyboardInterrupt:
for server in servers:
server.shutdown()
答案 1 :(得分:1)
通过将程序定义为守护程序线程,可以在程序结束时终止大量线程。为此,请将其daemon
属性设置为true。根据{{3}},
必须在调用
start()
之前设置,否则会引发RuntimeError
。它的初始值继承自创建线程;主线程不是守护程序线程,因此在主线程中创建的所有线程都默认为daemon
=False
。当没有剩下活着的非守护程序线程时,整个Python程序退出。
所以,这样的事情应该有效:
for port in [1111, 2222]:
t = Thread(target=serve_on_port, args=[port])
t.daemon = True
t.start()
try:
while True:
time.sleep(1000000)
except KeyboardInterrupt:
pass
请注意,任何非守护进程且仍在运行的线程都会阻止您的程序退出。如果您还有其他线程也希望在退出时被杀死,请在启动前将daemon
属性设置为True
。