8

我想编写一个无论如何都会在 5 秒后返回的函数:

def myfunction():
    while passed_time < 5_seconds:
        do1()
        do2()
        do3()
        .
        .
    return

我的意思是,这个函数只运行 5 秒,5 秒后,它应该结束,并继续执行其他函数:

myfunction()
otherfunction()   ----> This should start 5 seconds after myfunction() is executed.

此致

4

4 回答 4

5

你可以做:

def myfunction():
    start = time.time()
    while time.time() < start + 5:
        do1()
        do2()
        do3()

请注意,这将在至少5 秒后停止 - 如果do1do2、 和do3每个需要 3 秒,则此函数将需要 9 秒。


myFunction如果你想在这些电话之间切断,你可以这样做:

def myfunction():
    todo = itertools.cycle([do1, do2, do3])
    start = time.time()
    while time.time() < start + 5:
        todo.next()()

这种情况需要6s

于 2012-08-31T14:10:05.483 回答
3

如果您的函数的执行时间有可能比触发这些函数的时间间隔长,则您必须在另一个线程或进程中启动这些函数。

示例threading

import time
import sys
from threading import Thread


def f1():
    print "yo!!"
    time.sleep(6)


def f2():
    print "boring."
    time.sleep(2)


if __name__ == "__main__":
    threads = []
    try:
        for f in [f1, f2]:
            t = Thread(target=f)
            t.start()
            threads.append(t)
            time.sleep(5)
    except KeyboardInterrupt:
        sys.exit(0)
    finally:
        [t.join() for t in threads]

我理解这个问题的方式是,您不一定需要在 5 秒后终止/结束一个功能。您的主要目标是以 5 秒的间隔启动函数。如果您需要在一段时间后“杀死”函数,使用线程这将不是一件容易的事:有没有办法在 Python 中杀死一个线程?

于 2012-08-31T14:22:03.063 回答
1

你也可以这样做:

import time 
start=time.time()   

stuff={1:do1,2:do2,3:do3,...}
i=1

while time.time() <= start+5:
    stuff[i]()
    i+=1
于 2012-08-31T20:42:20.963 回答
1

从您定义问题的方式来看,我认为这是使用基于生成器的协同程序的好情况。也就是说,每次完成其处理步骤(例如or )时更改myFunction为 s 的生成器,并从检查时间的循环中运行它。yielddo1do2

这是一个重复运行单个somework函数的简单实现,但您可以轻松调用不同的函数,甚至直接在myFunction生成器中工作:

import time

def somework():
    print "Doing some work!"
    time.sleep(2)

def myFunction():
    try:
        print "Started myFunction()"
        yield somework()
        yield somework()
        yield somework()
        yield somework()
        yield somework()
        print "Done with myFunction()"
    except GeneratorExit:
        print "Exiting myFunction() early!"

def main():
    start = time.time()
    gen = myFunction()
    for _ in gen:
        if time.time() > start+5:
            gen.close();

使用这种结构有一些好处:

  1. 首先,myFunction可以选择它yield在外循环的位置,这样它就不会在意外的时间被杀死。如果它正在操作一些外部数据结构,您可以确保它始终以一致的状态产生所有内容。
  2. 其次,myFunction如果有用的话,可以产生中间值。上面的示例代码产生None(因为这是返回值,somework但您可以轻松更改。主循环将最新产生的值放入_变量中(未使用),但您可以重命名该变量并在超时时使用它的值如果你想阻止。
  3. 最后,通过捕获GeneratorExit异常,myFunction可以在它关闭之前运行它需要的任何清理代码。
于 2012-08-31T21:36:48.813 回答