Python3: 等待守护进程完成迭代

Python3: Wait for Daemon to finish iteration

我正在编写一个 python 脚本来启动本地文件服务器,当该服务器处于活动状态时,它将每 30 秒写入一个文件。我想让服务器和编写器同步运行运行,所以我将编写器函数设置为守护线程...我的主要问题是,一旦服务器停止,这个守护线程就会退出,如果守护进程在在写入文件的过程中会在退出前完成该操作吗?留下 1/2 个文件真的很糟糕。这是代码,但它将写入的实际文件大约有 3k 行 JSON,因此值得关注。

import http.server
import socketserver
from time import sleep
from threading import Thread


class Server:
    def __init__(self):
        self.PORT = 8000
        self.Handler = http.server.SimpleHTTPRequestHandler
        self.httpd = socketserver.TCPServer(("", self.PORT), self.Handler)
        print("Serving at port", self.PORT)

    def run(self):
        try:
            self.httpd.serve_forever()
        except KeyboardInterrupt:
            print("Server stopped")


def test():
    while True:
        with open('test', mode='w') as file:
            file.write('testing...')
        print('file updated')
        sleep(5)


if __name__ == "__main__":
    t = Thread(target=test, daemon=True)
    t.start()
    server = Server()
    server.run()

看来您可能做出了错误的决定,使编写器线程成为守护进程。
创建一个守护线程并不意味着它将 运行 同步。它仍然会受到GIL的影响。
如果要同步执行,则必须使用 multiprocessing

来自 Python 文档:

Daemon threads are abruptly stopped at shutdown. Their resources (such as open files, database transactions, etc.) may not be released properly. If you want your threads to stop gracefully, make them non-daemonic and use a suitable signalling mechanism such as an Event.

所以这意味着守护线程只适用于只有在主线程上下文中才有意义的任务,当主线程停止工作时无关紧要。文件I/O,尤其是数据保存,不适合守护线程。

所以看起来最明显和合乎逻辑的解决方案是使编写器线程成为非守护线程。
然后,即使主线程退出, Python 进程也不会结束,直到所有非守护线程都完成。这允许文件 I/O 完成并安全退出。

可以找到 Python 中守护线程的解释 here