在一定时间间隔内运行一些指令集

时间:2019-01-08 22:12:12

标签: python python-2.7 time

我需要生成介于0和指定间隔之间的正弦波数据(仅正值),并且对于正弦波的每个值,数据都会调用某些函数。

当前,我正在使用以下代码生成介于0和指定间隔之间的正弦波数据

np.sin(np.linspace(0,180, count)* np.pi / 180. )

它生成介于0到180之间的值。数组的大小等于count。

现在,我需要为生成的数组的每个值调用一些函数。每个值调用该函数的总时间应在某个预定义的时间间隔内完成。我尝试通过将预定义的时间间隔除以sleep来使用count函数。

我想知道是否还有其他方法可以实现上述功能,因为指令执行可能需要一些时间。

2 个答案:

答案 0 :(得分:2)

假设您想每10秒运行一次函数foo(),但是foo()的实际运行时间未知。在不依靠硬实时编程的情况下,您能做的最好的事情就是获取在以下时间间隔的其余时间:分别在调用foo()sleep()之前和之后的当前时间:

import time
INTERVAL = 10 # seconds

# Repeat this fragment as needed
start = time.time() # in seconds
foo()
elapsed = time.time() - start
remains = INTERVAL - elapsed
time.sleep(remains)

不过,请记住,sleep至少会睡眠这么长时间。由于进行了调度,它可能会睡得更久,在这种情况下,您的函数foo的执行频率可能会比所需的时间少。

答案 1 :(得分:1)

只需在@DYZ的答案周围放一些Python,就可以使用装饰器或上下文管理器来“修补”目标函数,并花一些时间来完成。

在下面的代码中,您有一个包含五个元素的列表,并且想要打印每个元素,总时间为5s,因此打印每个元素应该花费1s。

import time

data = [1, 2, 3, 4, 5]

# Decorator.
def patch_execution_time(limit):
    def wrapper(func):
        def wrapped(*args, **kwargs):
            init = time.time()
            result = func(*args, **kwargs)
            end = time.time()
            elapsed = end - init
            if elapsed < limit:
                time.sleep(limit - elapsed)
            return result
        return wrapped
    return wrapper

# Context manager, more usefull if the total time interval
# is dynamic.
class patch_execution_time_cxt(object):

    def __init__(self, operation, time):
        self.operation = operation
        self.time = time

    def __enter__(self):
        return patch_execution_time(self.time)(self.operation)

    def __exit__(self, *args):
        pass


# Two sample functions one decarated and the other for
# ilustrating the use of the context manager.
@patch_execution_time(1)
def foo(item):
    print(item)

def foo_1(item):
    print(item)

print("Using decoreted ...")
for item in data:
    foo(item)

print("Using context manager ...")
with patch_execution_time_cxt(foo_1, 1) as patched_foo:
    for item in data:
        patched_foo(item)