杀死在不同端口上运行的多个http服务器

时间:2015-03-04 19:21:16

标签: python multithreading python-multithreading socketserver

我使用以下内容启动多个服务器:

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停止这些帖子。 我怎么能这样做?

2 个答案:

答案 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