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

时间:2015-02-05 16:54:15

标签: python httpserver

我想在一个单独的线程中启动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)

但是,该线程仍然是“阻塞”,即未作为守护进程启动,并且解释器未到达print 'OK'。它既没有达到STUCK HERE

我已经知道线程只会在调用threading.Thread(...)时被初始化,并且主线程仍然会更进一步,直到它找到thread.start指令来启动它。

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

2 个答案:

答案 0 :(得分:9)

改变这个:

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

要成为这样:

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

并改变这一点:

thread.setdaemon = True

要成为这样:

thread.daemon = True

答案 1 :(得分:3)

尝试thread = threading.Thread(target = server.serve_forever),即不接听电话。

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

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