1

似乎应该有一个使用time模块或其他东西的简单解决方案,但我尝试了一些东西,似乎没有任何效果。我需要这样的东西才能工作:

hungry = True
if line.find ('feeds'):
    #hungry = False for 60 seconds, then hungry is true again

有人对此有解决方案吗?

编辑:至于我试过的,我试过这段代码:

if hungry==True:
     print('yum! not hungry for 20 seconds')
     hungry = False
     i = 20
     while(i>0):
         i-=1
         time.sleep(1)
         if(i==0):
             hungry = True

但这不起作用,因为程序只是暂停直到hungry再次为真,hungry而在程序睡眠时为假无济于事;在程序的其余部分工作时,它应该在一定时间内为假

编辑:看起来如果没有线程,这将是不可能的。我必须要么找到一个新的解决方案,要么学会使用线程。无论如何,感谢您的所有帮助,我非常感谢!

4

5 回答 5

3

您可以将您想要的行为封装在一个TimedValue类中,但这在这里可能有点矫枉过正——我可能会做类似的事情

now = time.time()
hunger = lambda: time.time() > now + 60

然后hunger()在我想要的值而不是hungry. 这样,代码不会阻塞,我们可以继续工作,但hunger()会给我们正确的状态。例如

import time
now = time.time()
hunger = lambda: time.time() > now + 60
for i in range(10):
    print 'doing stuff here on loop', i
    time.sleep(10)
    print 'hunger is', hunger()

生产

doing stuff here on loop 0
hunger is False
doing stuff here on loop 1
hunger is False
doing stuff here on loop 2
hunger is False
doing stuff here on loop 3
hunger is False
doing stuff here on loop 4
hunger is False
doing stuff here on loop 5
hunger is True
doing stuff here on loop 6
hunger is True
doing stuff here on loop 7
hunger is True
doing stuff here on loop 8
hunger is True
doing stuff here on loop 9
hunger is True
于 2013-01-20T23:30:01.867 回答
1

我不确定您需要什么样的准确性,但也许您可以只睡 60 秒,然后将变量设置为 true?

from time import sleep
hungry = True
if line.find('feeds'):
  hungry = False
  sleep(60)
  hungry = True
于 2013-01-20T23:27:51.407 回答
1

您可以按照以下方式做一些事情:

from threading import Timer
import time

class Time_out(object):
    def __init__(self,secs):
        self.timer = Timer(secs,self.set_false)
        self.hungry=True
        self.timer.start()

    def set_false(self):
        self.hungry=False

if __name__ == '__main__':
    x=Time_out(1)
    y=0
    t1=time.time()
    while x.hungry:
        y+=1
        # this loop -- do whatever... I just increment y as a test...

    print 'looped for {:.5} seconds, y increased {:,} times in that time'.format(time.time()-t1, y)

印刷:

looped for 1.0012 seconds, y increased 5,239,754 times in that time

我在这里使用的超时值为 1 秒,但您可以使用自己的值。然后在while循环中完成工作。这是一个非常原始但有效的回调。

优点是您可以拥有许多Time_out对象,并且循环将继续进行,直到没有人饿为止!

于 2013-01-20T23:34:22.357 回答
1

您也可以使用类似下面的代码。这是一个优雅的 OOP 解决方案,使用和维护都很方便。

from time import time

class TimedProperty(object):

    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2
        self.start_time = -1
        self.time_value = 0

    @property
    def value(self):
        if self.valuenum == 0:
            return self.value1
        else:
            return self.value2

    @property
    def valuenum(self):
        if time() - self.start_time > self.time_value:
            return 0
        else:
            return 1

    def switch_for(self, seconds, value=None):
        self.start_time = time()
        self.time_value = seconds
        if value is not None:
            self.value2 = value

用法:

def main():
    p = TimedProperty(True, False)
    print p.value
    print p.valuenum
    p.switch_for(0.2)
    print p.value
    print p.valuenum
    sleep(0.5)
    print p.value
    print p.valuenum

输出:

True
0
False
1
True
0

codepad.org 上的示例:http://codepad.org/glujHgey 在键盘上禁止 sleep(),它已被时间消耗 for 循环所取代)

于 2013-01-20T23:47:57.440 回答
0

简单的解决方案:

from time import time # time() is the time in seconds since the epoch (January 1st, 1970)
hungry = True
if line.find('feeds'):
    start, hungry = time(), False # it will be a fraction of a second off 
    while 1:                      # because hungry is set to False right 
        if (time() - start) >= 60:  # after start is set to the current time
            hungry = True             
            break  

注意:这可能不完全是 60 秒,因为time()(至少,我被告知)可能会受到程序内存使用的影响;因此,它可能会略微偏离。

此外,除非您使用线程,否则您实际上无法在程序中执行任何其他操作。while不过,您可以在循环中运行程序的其余部分。

编辑:您可以创建一个执行此操作的函数。因此,您可以让程序的一部分运行,然后检查是否是时候再次更改饥饿的值:

def isHungry(start):
     from time import time
     if (time() - start) >= 60: hungry = True # if 60 seconds has passed
     else: hungry = False
     return hungry

from time import time
# some code
if line.find('feeds'):
    start = time()
# a bit of code
hungry = isHungry(start)
# more code
hungry = isHungry(start)
于 2013-01-20T23:23:21.140 回答