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は再び True になるまで一時停止するだけでありhungry、プログラムがスリープしている間は false であっても役に立たないからです。プログラムの残りの部分が動作している間、一定時間 false である必要があります

編集:これは、スレッド化なしでは不可能のようです。新しい解決策を見つけるか、スレッドの使い方を学ぶ必要があります。とにかくすべての助けをありがとう、私はそれを真剣に感謝します!

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 (codepad では 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  

注:(time()少なくとも、これは言われていますが)プログラムのメモリ使用量の影響を受ける可能性があるため、これは正確に60秒ではない場合があります。したがって、わずかにずれている可能性があります。

また、スレッドを使用しない限り、プログラムで他に何もすることはできません。ただし、プログラムの残りの部分を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 に答える