首页 > 解决方案 > 无法使用线程在后台运行 python http 服务器

问题描述

我正在尝试使用线程在后台运行 python http 服务器。我遇到了几个执行以下操作的参考:

import threading
import http.server
import socket 
from http.server import HTTPServer, SimpleHTTPRequestHandler

debug = True
server = http.server.ThreadingHTTPServer((socket.gethostname(), 6666), SimpleHTTPRequestHandler)
if debug:
    print("Starting Server in background")
    thread = threading.Thread(target = server.serve_forever)
    thread.daemon = True
    thread.start()
else:
    print("Starting Server")
    print('Starting server at http://{}:{}'.format(socket.gethostname(), 6666))
    server.serve_forever()

当 thread.daemon 设置为True时,程序将在不启动服务器的情况下完成(端口 6666 上没有运行)。当我将 thread.daemon 设置为False时,它​​会在前台启动服务器并阻止终端,直到我手动将其杀死。

关于如何使这项工作的任何想法?

标签: pythonpython-multithreadinghttp.server

解决方案


在这两种情况下,服务器都是在后台启动的,在单独的线程中。这意味着thread.start()启动服务器,python 继续执行主线程中的其余代码。

但是,您的程序中似乎没有其他内容可以执行。Python 到达文件末尾,主线程完成。

操作系统要求在进程完成之前完成所有非守护线程。当thread.daemon设置为False操作系统等待直到服务器线程退出(这永远不会发生,serve_forever顾名思义)。当它是True在主线程完成后立即关闭进程。

将您想要异步执行的任何代码放在之后thread.start()就完成了!


推荐阅读