Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python中没有计时器类';s多处理模块?_Python_Multithreading_Timer_Multiprocessing - Fatal编程技术网

为什么Python中没有计时器类';s多处理模块?

为什么Python中没有计时器类';s多处理模块?,python,multithreading,timer,multiprocessing,Python,Multithreading,Timer,Multiprocessing,因此,threading模块从Thread类中继承了一个Timer类来重复执行一些任务 我想知道为什么多处理模块没有类似的TimedProcess类,例如,从Process继承来重复执行一些任务 可以编写这样一个定时过程,我已经编写了一个,但仍然很好奇。还是我遗漏了什么?自己实现起来非常简单: from multiprocessing import Process, Event class Timer(Process): def __init__(self, interval, fu

因此,
threading
模块从
Thread
类中继承了一个
Timer
类来重复执行一些任务

我想知道为什么多处理模块没有类似的
TimedProcess
类,例如,从
Process
继承来重复执行一些任务


可以编写这样一个定时过程,我已经编写了一个,但仍然很好奇。还是我遗漏了什么?

自己实现起来非常简单:

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中没有一个。也许是因为它不太可能有用?

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

但让我们试着做出一些有根据的猜测

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

几乎任何需要定时器的非平凡应用程序都需要多个定时器、循环定时器、相对快速的定时器等。为每个定时事件启动一个新线程是一个糟糕的想法

那么,为什么它甚至出现在
线程中呢

嗯,对于普通的应用程序来说,它实际上是有用的。例如,在单个进程应用程序中添加
线程
,只是为了启动
计时器
向主线程发送信号并在主线程丢失时中断它,这并不是不合理的。但这与多处理无关

另外,
threading
是其中一个模块,其设计目的是作为示例代码使用,而不仅仅是作为库使用,在首次添加时尤其如此。这就是链接到的原因。而且
Timer
是一段很好的示例代码,它的功能和工作方式很明显,很难想象有什么更简单的方法可以演示如何使用同步对象。但是,您不需要在两个地方使用代码作为示例,也不需要演示任何额外的和多处理特定的内容

最后,Itamar Shtull Trauring想要它,做了工作,并提供了它,没有人有任何好的理由反对包括它;大概同样的事情在
pyprocessing
中从未发生过**

在2.6/3.0规划期间,将
pyprocessing
调整到stdlib
多处理
模块中。这是一项相当大的工作,而且做得有点匆忙,特别是因为他们承担了对
线程
中的名称进行加密的任务,这样他们就不必重命名所有
pyprocessing
来匹配
线程
中的非标准名称,只是为了在
线程
修复一两年后,有人可以重新命名它们。因此,尽管尽可能成为
线程的替代品是次要目标之一,但我猜没有人做过完整的调查来确保这一目标的实现

从那时起,想必,要么没有人注意到它丢失并提出了它,要么没有人提出了足够令人信服的论点,要么没有人做了实际的工作。如果您认为应该添加它,并且可以捍卫您的信念,创建一个bug或编写python想法,包括您的实现,并签署PSF贡献者协议,那么它可能会让您永生。:)

*不幸的是,我找不到任何指向
pyprocessing
的好的历史链接。源repo已经死了,贡献者继续维护stdlib
多处理
模块和PyPI后端口,即使该项目已基本被取代,在这几年中,一个新的和不相关的项目已经取代了原来的名称


**请注意,在第一次建议使用
Timer
的地方,有一半以上的理由是它是一个很好的示例代码。

请参阅我所知的调度程序并不是从进程中独立出来的。如果计时器可以从线程中提取,为什么另一个计时器不能说TimerProc inheret from Process?@Manas:你不会称它为
TimerProc
,它只是
多处理。Timer
。事实上,我相信你可以复制并粘贴
threading.py
中的代码,将
Thread
更改为
Process
出现的两个位置,然后就可以完成了。是的,我最后也做了同样的事情。但线程和计时器也是如此。因此,决定不包括在stdlib中是很有趣的,除非有紧迫的理由。就我所见,重复执行进程比重复执行线程有更多的优势。进程相对于线程的所有优势,如无共享内存、GIL、真正的多处理等。我可以看到这些功能的用途。问题已经说“有可能编写这样一个定时进程,我已经编写了一个”,所以我不认为演示如何编写一个进程可以回答这个问题。@abarnert同意-我已经花了15分钟左右的时间搜索邮件列表/提交日志,寻找一些证据来证明它为什么没有被包括在内,所以我可以把它编辑成我的答案。但是,正如你发现的那样,这里真的没有提到它。这似乎只是一个“没有人真正关心它”的例子。@Manas很有可能,如果您提交了一个补丁来添加一个
多处理.Timer
,它将被接受。当你在谷歌上搜索“multiprocessing.timer”、“Multitprocessing timer”等时,没有结果,这似乎表明很少有人错过了它。人们可能不会错过它,因为它是一件很容易实现的小事,尽管我相信大多数人只是使用了
线程化.timer
,我认为这是一种重复执行任务的糟糕方式。