作为线程启动的 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
我想在单独的线程中启动 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