因此threading
模块有一个Timer
类来自Thread
类,可以重复执行某些任务。
我想知道为什么多处理模块不具有类似TimedProcess
类的东西,例如,Process
来自{{1}}以反复执行某些任务?
可以编写这样一个定时过程,我写了一个但仍然好奇。或者我错过了什么?
答案 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 371将pyprocessing
改编为stdlib multiprocessing
模块。这是一项相当大的工作,并且有点匆忙,特别是因为他们承担了PEP8的任务 - 在threading
中使用了名称,因此他们不必重命名所有pyprocessing
匹配threading
中的非标准名称只是为了在threading
一年或两年后修复threading
时再次重命名。因此,即使尽可能直接替换pyprocessing
是次要目标之一,我猜测没有人做过完整的调查以确保完成。
从那时起,据推测,要么没有人注意到它丢失并提出它,或者没有人做出足够引人注目的论证,或者没有人做过实际的工作。如果您认为应该添加它,并且可以捍卫您的信念,创建错误或写入python-ideas,并包含您的实现,并签署PSF贡献者的协议,它可能会让您永生。 :)
*很遗憾,我找不到multiprocessing
的任何良好的历史链接。源代码已经死了,贡献者继续维护stdlib Timer
模块和PyPI multiprocessing
反向端口,即使该项目已基本上被billiard
取代,并且在此期间新的和不相关的项目取代了原来的名字......
**请注意,在issue #428326中,首先提出{{1}},其中一半以上的理由是它是一个很好的示例代码。