Python 线程定时器的初始守护进程。

12

这段代码没有起作用...

self._thread = threading.Timer(interval=2, 
                               function=self._sendRequestState, 
                               args=(self._lockState,), 
                               daemon=True).start()

所以我应该像这样写下来...

self._thread = threading.Timer(interval=2, 
                               function=self._sendRequestState, 
                               args=(self._lockState,))
self._thread.daemon = True
self._thread.start()

但是 Timer 类有 Thread.__init__Thread.__init__ 的输入参数中有 "daemon"。我不知道为什么它不起作用...


你的代码中还有其他语句吗?为什么要将线程设置为“守护”线程?如果没有其他语句,当只剩下“守护”线程时,Python 将退出,你的线程将永远没有执行的时间。 - Brendan Abel
@BrendanAbel 有很多线程 :) 谢谢! - Hazel
1个回答

13

您可以在此处找到那个threading.Thread()构造函数的源代码(来自cpython,最常见的Python实现)

def __init__(self, interval, function, args=None, kwargs=None):
    Thread.__init__(self)
    self.interval = interval
    self.function = function
    self.args = args if args is not None else []
    self.kwargs = kwargs if kwargs is not None else {}
    self.finished = Event()
如果您传递daemon=True,那么它将放入kwargs中,但是正如您在代码中看到的那样,它不起作用。 因此,是的,您是正确的,您必须在创建后(并在调用start()之前)设置daemon属性。 在构造Timer时似乎没有直接设置它的选项。

不会将 daemon 参数放在 kwargs 中,因为这里的 kwargs 是一个关键字参数,而不是双星号捕获器。传递 daemon=True 时会引发 TypeError。 - Gouvernathor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接