Python 具有时间间隔的周期性函数执行<;100毫秒

Python 具有时间间隔的周期性函数执行<;100毫秒,python,python-3.x,multithreading,periodic-task,Python,Python 3.x,Multithreading,Periodic Task,我的目标是在一个周期性的时间间隔上执行一个函数,但要有一个高周期。 下面链接的代码似乎很有希望: . 经过一些小的修改,我最终得出以下结论: import threading import time from datetime import timedelta from unittest.mock import Mock WAIT_TIME_SECONDS = 0.1 class PeriodicTask(threading.Thread): """ C

我的目标是在一个周期性的时间间隔上执行一个函数,但要有一个高周期。 下面链接的代码似乎很有希望:
. 经过一些小的修改,我最终得出以下结论:

import threading
import time
from datetime import timedelta
from unittest.mock import Mock

WAIT_TIME_SECONDS = 0.1

class PeriodicTask(threading.Thread):
    """ Class for executing a periodic task specifying a time interval between invokations """
    def __init__(self, interval: timedelta, execute: Callable[..., None], *args, **kwargs):
        super().__init__()
        assert isinstance(interval, timedelta), "Must specifiy datetime time interval, here"
        assert not execute is None, "Must specify function which should be invoked regularly, here"

        self.daemon = False
        self.stopped = threading.Event()
        self.interval = interval
        self.execute = execute
        self.args = args
        self.kwargs = kwargs

    def stop(self):
        """ Stop periodic task """
        self.stopped.set()
        self.join()

    def run(self):
        """ Run task based on the specified interval """
        while not self.stopped.wait(self.interval.total_seconds()):
            self.execute(*self.args, **self.kwargs)

if __name__ == "__main__":
    foo = Mock()
    job = PeriodicTask(interval=timedelta(seconds=WAIT_TIME_SECONDS), execute=foo)
    job.start()

    time.sleep(1)
    job.stop()

在任务相互阻碍之前,我似乎可以执行周期性任务,执行时间最短约为100ms(Intel Core i7-3770K CPU,3.5 GHz,16 GB RAM)。是否有办法优化此代码片段,以便我可以周期性地执行任务,时间至少为10毫秒?

您是否尝试过并行化?我想在每次给定的时间间隔结束时执行指定的函数。我不想并行执行它。回调函数具有“观察者”的角色,最终观察某些状态。但这只是一个最小的例子。我不应该叫它“福”。是我的错。我真的应该称它为“观察者”,在代码中添加以下行:
print(f“调用函数{foo.call\u count}次”)
并减少
WAIT\u TIME\u SECONDS
,直到
call\u count
不再改变它的值。@pqans每个操作系统在实时性方面都有其局限性。再加上你期望做的事情的开销,你会很快得到一些限制。随着代码的减少,
WAIT_TIME_SECONDS
会给出线性结果,直到大约100ms,但即使值为
0.00001
,也会发生变化,即使值不是
90000
,而是更低(例如,我得到了大约25000)。对我来说,它在
0.0000001
时停止变化,即1/10.000.000秒,但它“仅”显示10万次运行(不是一千万次)。在某些情况下,您编写的任何代码都会使情况变得更糟。似乎唯一的方法是使用time.perf_计数器返回到老式的轮询方式。另一方面,我不想把性能计数器分散在我的代码中。你试过并行化吗?我想在每次给定的时间间隔结束时执行指定的函数。我不想并行执行它。回调函数具有“观察者”的角色,最终观察某些状态。但这只是一个最小的例子。我不应该叫它“福”。是我的错。我真的应该称它为“观察者”,在代码中添加以下行:
print(f“调用函数{foo.call\u count}次”)
并减少
WAIT\u TIME\u SECONDS
,直到
call\u count
不再改变它的值。@pqans每个操作系统在实时性方面都有其局限性。再加上你期望做的事情的开销,你会很快得到一些限制。随着代码的减少,
WAIT_TIME_SECONDS
会给出线性结果,直到大约100ms,但即使值为
0.00001
,也会发生变化,即使值不是
90000
,而是更低(例如,我得到了大约25000)。对我来说,它在
0.0000001
时停止变化,即1/10.000.000秒,但它“仅”显示10万次运行(不是一千万次)。在某些情况下,您编写的任何代码都会使情况变得更糟。似乎唯一的方法是使用time.perf_计数器返回到老式的轮询方式。另一方面,我不想把性能计数器分散在我的代码中。