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

Man*_*nas 6 python multithreading timer multiprocessing

因此,threading模块有一个Timer类从Thread类中反复执行某些任务.

我想知道为什么多处理模块没有类似于类似的TimedProcess类,例如,它是否Process反复执行某些任务?

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

dan*_*ano 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()
Run Code Online (Sandbox Code Playgroud)

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


aba*_*ert 5

这是一个相当开放的问题,字面上的答案不会很有用.

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

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

几乎任何需要计时器的非平凡应用程序都需要多个计时器,重复计时器,相对快速的计时器等.为每个定时事件启动一个新线程是一个糟糕的主意.

那么,为什么它甚至在threading

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

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

最后,Itamar Shtull-Trauring想要它,完成了工作并提供了它,没有人反对把它包括在内; 大概同样的事情从未发生过pyprocessing.**

在2.6/3.0规划期间,PEP 371适用pyprocessing于stdlib multiprocessing模块.这是一个相当艰巨的任务,并在有点仓促完成的,特别是因为他们采取了对PEP8-ifying了名称中的任务threading,这样他们就不必重命名所有的pyprocessing,以匹配非标准名称threading只为有人在threading一两年后修复后重新将它们全部重命名.因此,尽管作为threading次要目标的替代品是次要目标之一,但我猜测没有人做过完整的调查以确保完成.

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

*不幸的是,我找不到任何好的历史链接pyprocessing.源代码已经死了,贡献者继续维护stdlib multiprocessing模块和PyPI反向multiprocessing端口,即使该项目已被大部分取代billiard,并且在此期间,一个新的和不相关的项目取代了原来的名称......

**请注意,问题#428326,Timer首先提出的地方,超过一半的理由是它是很好的示例代码.