作为线程启动的 SimpleHTTPServer:不守护进程

SimpleHTTPServer launched as a thread: does not daemonize

我想在单独的线程中启动 SimpleHTTPServer,同时在主线程中执行其他操作(此处为 time.sleep(100))。这是我的代码的简化示例:

from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer

server = HTTPServer(('', 8080), SimpleHTTPRequestHandler)
print 'OK UNTIL NOW'
thread = threading.Thread(target = server.serve_forever())
print 'STUCK HERE'
thread.setdaemon = True
try:
    thread.start()
except KeyboardInterrupt:
    server.shutdown()
    sys.exit(0)

print 'OK'

time.sleep(120)

但是,线程保持 "blocking",即未作为守护进程启动,并且解释器未到达 print 'OK'。它既没有到达 STUCK HERE.

虽然线程只会在调用 threading.Thread(...) 时初始化,并且主线程仍会继续执行,直到它找到 thread.start 指令来启动它。

有没有更好的方法来完成这个任务?

尝试thread = threading.Thread(target = server.serve_forever),即不调用。

您的版本的问题是 serve_forever() 在解析创建线程的行时被调用。因此,您永远不会到达下一行。

参数类型必须是可调用的,将在线程启动时调用,所以 您需要传递名称,server.serve_forever 而不是尝试传递执行此函数的结果。

改变这个:

thread = threading.Thread(target = server.serve_forever())

变成这样:

thread = threading.Thread(target = server.serve_forever)

并更改此:

thread.setdaemon = True

变成这样:

thread.daemon = True