我想在一个单独的线程中启动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
指令来启动它。
有没有更好的方法来完成这项任务?
答案 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
,而不是尝试传递执行此函数的结果。