为什么Python的多处理模块中没有Timer类?

时间:2014-08-13 23:05:25

标签: python multithreading timer multiprocessing

因此threading模块有一个Timer类来自Thread类,可以重复执行某些任务。

我想知道为什么多处理模块不具有类似TimedProcess类的东西,例如,Process来自{{1}}以反复执行某些任务?

可以编写这样一个定时过程,我写了一个但仍然好奇。或者我错过了什么?

2 个答案:

答案 0 :(得分:6)

自己实施非常简单:

from multiprocessing import Process, Event


class Timer(Process):
    def __init__(self, interval, function, args=[], kwargs={}):
        super(Timer, self).__init__()
        self.interval = interval
        self.function = function
        self.args = args
        self.kwargs = kwargs
        self.finished = Event()

    def cancel(self):
        """Stop the timer if it hasn't finished yet"""
        self.finished.set()

    def run(self):
        self.finished.wait(self.interval)
        if not self.finished.is_set():
            self.function(*self.args, **self.kwargs)
        self.finished.set()

我不确定为什么stdlib中没有包含一个。也许是因为它不太可能有用?

答案 1 :(得分:5)

这是一个非常开放的问题,字面上的答案不会很有用。

但是,让我们尝试一些有根据的猜测。

pyprocessing *没有它。为什么不?可能是因为它不是特别有用。

几乎所有需要计时器的非平凡应用程序都需要多个计时器,定期计时器,相对较快的计时器等。为每个定时事件启动一个新线程是一个糟糕的主意。

那么,为什么它甚至在threading

嗯,对于琐碎的应用程序,它实际上很有用。将threading添加到单进程应用程序中并不是不合理的,因此您可以启动Timer来发出主线程信号并在其丢失时中断它,例如。但这与multiprocessing无关。

此外,threading是设计用作示例代码的模块之一,而不仅仅是作为库 - 在首次添加时尤其如此。这就是the docs链接到the source的原因。而且Timer是一个很好的示例代码 - 它的作用和工作方式很明显,而且很难想象可以演示如何使用同步对象的更简单的东西。但是你不需要两个地方的代码作为例子,并且没有任何额外的和多处理特定的演示。

最后,Itamar Shtull-Trauring想要它,完成了工作并提供了它,并且没有人反对包括它;据推测,pyprocessing从未发生同样的事情。**

在2.6 / 3.0规划期间,PEP 371pyprocessing改编为stdlib multiprocessing模块。这是一项相当大的工作,并且有点匆忙,特别是因为他们承担了PEP8的任务 - 在threading中使用了名称,因此他们不必重命名所有pyprocessing匹配threading中的非标准名称只是为了在threading一年或两年后修复threading时再次重命名。因此,即使尽可能直接替换pyprocessing是次要目标之一,我猜测没有人做过完整的调查以确保完成。

从那时起,据推测,要么没有人注意到它丢失并提出它,或者没有人做出足够引人注目的论证,或者没有人做过实际的工作。如果您认为应该添加它,并且可以捍卫您的信念,创建错误或写入python-ideas,并包含您的实现,并签署PSF贡献者的协议,它可能会让您永生。 :)

*很遗憾,我找不到multiprocessing的任何良好的历史链接。源代码已经死了,贡献者继续维护stdlib Timer模块和PyPI multiprocessing反向端口,即使该项目已基本上被billiard取代,并且在此期间新的和不相关的项目取代了原来的名字......

**请注意,在issue #428326中,首先提出{{1}},其中一半以上的理由是它是一个很好的示例代码。